@memberjunction/ng-base-forms 5.37.0 → 5.39.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 (114) hide show
  1. package/README.md +53 -0
  2. package/dist/lib/base-form-component.d.ts +46 -0
  3. package/dist/lib/base-form-component.d.ts.map +1 -1
  4. package/dist/lib/base-form-component.js +68 -2
  5. package/dist/lib/base-form-component.js.map +1 -1
  6. package/dist/lib/container/record-form-container.component.d.ts +77 -1
  7. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  8. package/dist/lib/container/record-form-container.component.js +157 -39
  9. package/dist/lib/container/record-form-container.component.js.map +1 -1
  10. package/dist/lib/field/fk-search-utils.d.ts +31 -0
  11. package/dist/lib/field/fk-search-utils.d.ts.map +1 -0
  12. package/dist/lib/field/fk-search-utils.js +47 -0
  13. package/dist/lib/field/fk-search-utils.js.map +1 -0
  14. package/dist/lib/field/form-field.component.d.ts +401 -6
  15. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  16. package/dist/lib/field/form-field.component.js +1646 -214
  17. package/dist/lib/field/form-field.component.js.map +1 -1
  18. package/dist/lib/field/linked-field-options.d.ts +76 -0
  19. package/dist/lib/field/linked-field-options.d.ts.map +1 -0
  20. package/dist/lib/field/linked-field-options.js +80 -0
  21. package/dist/lib/field/linked-field-options.js.map +1 -0
  22. package/dist/lib/host/entity-form-host.component.d.ts +159 -0
  23. package/dist/lib/host/entity-form-host.component.d.ts.map +1 -0
  24. package/dist/lib/host/entity-form-host.component.js +539 -0
  25. package/dist/lib/host/entity-form-host.component.js.map +1 -0
  26. package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
  27. package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
  28. package/dist/lib/interactive-form/interactive-form.component.js +560 -0
  29. package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
  30. package/dist/lib/isa-related-panel/isa-related-card.component.js +2 -2
  31. package/dist/lib/overlays/base-form-overlay.d.ts +114 -0
  32. package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -0
  33. package/dist/lib/overlays/base-form-overlay.js +227 -0
  34. package/dist/lib/overlays/base-form-overlay.js.map +1 -0
  35. package/dist/lib/overlays/form-dialog.component.d.ts +35 -0
  36. package/dist/lib/overlays/form-dialog.component.d.ts.map +1 -0
  37. package/dist/lib/overlays/form-dialog.component.js +92 -0
  38. package/dist/lib/overlays/form-dialog.component.js.map +1 -0
  39. package/dist/lib/overlays/form-presenter.service.d.ts +37 -0
  40. package/dist/lib/overlays/form-presenter.service.d.ts.map +1 -0
  41. package/dist/lib/overlays/form-presenter.service.js +130 -0
  42. package/dist/lib/overlays/form-presenter.service.js.map +1 -0
  43. package/dist/lib/overlays/form-presenter.types.d.ts +65 -0
  44. package/dist/lib/overlays/form-presenter.types.d.ts.map +1 -0
  45. package/dist/lib/overlays/form-presenter.types.js +25 -0
  46. package/dist/lib/overlays/form-presenter.types.js.map +1 -0
  47. package/dist/lib/overlays/form-slide-in.component.d.ts +38 -0
  48. package/dist/lib/overlays/form-slide-in.component.d.ts.map +1 -0
  49. package/dist/lib/overlays/form-slide-in.component.js +106 -0
  50. package/dist/lib/overlays/form-slide-in.component.js.map +1 -0
  51. package/dist/lib/overlays/form-window.component.d.ts +32 -0
  52. package/dist/lib/overlays/form-window.component.d.ts.map +1 -0
  53. package/dist/lib/overlays/form-window.component.js +93 -0
  54. package/dist/lib/overlays/form-window.component.js.map +1 -0
  55. package/dist/lib/panel/collapsible-panel.component.d.ts +19 -2
  56. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  57. package/dist/lib/panel/collapsible-panel.component.js +70 -13
  58. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  59. package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
  60. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
  61. package/dist/lib/panel-slot/base-form-panel.js +64 -0
  62. package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
  63. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
  64. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
  65. package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
  66. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
  67. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
  68. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
  69. package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
  70. package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
  71. package/dist/lib/resolver/form-resolver.service.d.ts +139 -0
  72. package/dist/lib/resolver/form-resolver.service.d.ts.map +1 -0
  73. package/dist/lib/resolver/form-resolver.service.js +235 -0
  74. package/dist/lib/resolver/form-resolver.service.js.map +1 -0
  75. package/dist/lib/section-manager/section-manager.component.js +2 -2
  76. package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
  77. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  78. package/dist/lib/toolbar/form-toolbar.component.js +294 -136
  79. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  80. package/dist/lib/types/entity-form-config.d.ts +125 -0
  81. package/dist/lib/types/entity-form-config.d.ts.map +1 -0
  82. package/dist/lib/types/entity-form-config.js +75 -0
  83. package/dist/lib/types/entity-form-config.js.map +1 -0
  84. package/dist/lib/types/form-types.d.ts +24 -0
  85. package/dist/lib/types/form-types.d.ts.map +1 -1
  86. package/dist/lib/types/form-types.js.map +1 -1
  87. package/dist/lib/types/navigation-events.d.ts +64 -2
  88. package/dist/lib/types/navigation-events.d.ts.map +1 -1
  89. package/dist/lib/types/navigation-events.js.map +1 -1
  90. package/dist/lib/types/toolbar-config.d.ts +11 -0
  91. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  92. package/dist/lib/types/toolbar-config.js +3 -0
  93. package/dist/lib/types/toolbar-config.js.map +1 -1
  94. package/dist/module.d.ts +14 -7
  95. package/dist/module.d.ts.map +1 -1
  96. package/dist/module.js +40 -7
  97. package/dist/module.js.map +1 -1
  98. package/dist/public-api.d.ts +15 -0
  99. package/dist/public-api.d.ts.map +1 -1
  100. package/dist/public-api.js +21 -0
  101. package/dist/public-api.js.map +1 -1
  102. package/package.json +17 -11
  103. package/dist/__tests__/sanity.test.d.ts +0 -2
  104. package/dist/__tests__/sanity.test.d.ts.map +0 -1
  105. package/dist/__tests__/sanity.test.js +0 -12
  106. package/dist/__tests__/sanity.test.js.map +0 -1
  107. package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
  108. package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
  109. package/dist/__tests__/tag-count-badge.test.js +0 -70
  110. package/dist/__tests__/tag-count-badge.test.js.map +0 -1
  111. package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
  112. package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
  113. package/dist/lib/__tests__/base-forms.test.js +0 -256
  114. package/dist/lib/__tests__/base-forms.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"form-toolbar.component.js","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts","../../../src/lib/toolbar/form-toolbar.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, TemplateRef, ChangeDetectorRef, inject, DoCheck } from '@angular/core';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from '../isa-related-panel/isa-hierarchy-utils';\nimport { FormWidthMode, FormContext } from '../types/form-types';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs,\n CustomToolbarButton\n} from '../types/form-events';\n\n/**\n * Configurable form toolbar component.\n *\n * Renders action buttons (edit, save, delete, favorite, history, lists),\n * the IS-A entity hierarchy breadcrumb, and section controls (search, expand/collapse).\n *\n * All navigation actions are emitted as events - the toolbar never calls any routing\n * service directly. The host application subscribes and maps to its own navigation.\n *\n * @example\n * ```html\n * <mj-form-toolbar\n * [record]=\"record\"\n * [editMode]=\"editMode\"\n * [config]=\"toolbarConfig\"\n * (Navigate)=\"onNavigate($event)\"\n * (EditModeChange)=\"editMode = $event\"\n * (SaveRequested)=\"onSave()\"\n * (DeleteRequested)=\"onDelete()\">\n * </mj-form-toolbar>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-toolbar.component.html',\n styleUrls: ['./form-toolbar.component.css']\n})\nexport class MjFormToolbarComponent implements DoCheck {\n private cdr = inject(ChangeDetectorRef);\n\n // ---- Deprecated form reference (backward compat) ----\n\n private _formRef: unknown;\n\n /**\n * @deprecated Use `<mj-record-form-container>` or pass individual inputs instead.\n * Accepts a form component reference for backward compatibility.\n * When set, the toolbar reads Record, EditMode, etc. from this reference.\n */\n @Input() set Form(value: unknown) { this._formRef = value; }\n get Form(): unknown { return this._formRef; }\n\n /** @deprecated Use [Form] or individual inputs instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n // ---- Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** Whether the current user has edit permission */\n @Input() UserCanEdit = false;\n\n /** Whether the current user has delete permission */\n @Input() UserCanDelete = false;\n\n /** Whether the record is currently a favorite */\n @Input() IsFavorite = false;\n\n /** Whether favorite init has completed (prevents flash of wrong icon) */\n @Input() FavoriteInitDone = false;\n\n /** Whether the record has unsaved changes */\n @Input() IsDirty = false;\n\n /** Names of dirty fields for display in save bar */\n @Input() DirtyFieldNames: string[] = [];\n\n /** Count of lists this record belongs to */\n @Input() ListCount = 0;\n\n /** Number of tags applied to this record */\n @Input() TagCount = 0;\n\n /** Whether the tags panel is currently open */\n @Input() IsTagsPanelOpen = false;\n\n /** Number of record change versions for this record (displayed as \"vN\" badge on history button) */\n @Input() VersionCount = 0;\n\n /** Entity info for IS-A hierarchy and metadata */\n @Input() EntityInfo: EntityInfo | null = null;\n\n /** Toolbar configuration controlling visibility and behavior */\n @Input() Config: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n\n /** Whether to show the toolbar in a saving/loading state */\n @Input() IsSaving = false;\n\n // Section controls inputs\n @Input() VisibleSectionCount = 0;\n @Input() TotalSectionCount = 0;\n @Input() ExpandedSectionCount = 0;\n @Input() SearchFilter = '';\n @Input() ShowEmptyFields = false;\n @Input() WidthMode: FormWidthMode = 'centered';\n @Input() HasCustomSectionOrder = false;\n\n /** Optional template for additional toolbar actions */\n @Input() AdditionalActionsTemplate: TemplateRef<unknown> | null = null;\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (record links, hierarchy clicks, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Request to enter or exit edit mode */\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 /** Request to save the current record */\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 /** Request to cancel editing and revert changes */\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 /** Request to delete the current record */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Request to toggle favorite status */\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 /** Request to show record change history */\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 /** Request to show list management */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when the Tags button is clicked */\n @Output() TagsPanelToggled = new EventEmitter<void>();\n\n /** Request to show dirty field changes */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n // Section control outputs\n @Output() FilterChange = new EventEmitter<string>();\n @Output() ExpandAllRequested = new EventEmitter<void>();\n @Output() CollapseAllRequested = new EventEmitter<void>();\n @Output() ShowEmptyFieldsChange = new EventEmitter<boolean>();\n @Output() WidthModeChange = new EventEmitter<FormWidthMode>();\n @Output() ResetSectionOrderRequested = new EventEmitter<void>();\n @Output() ManageSectionsRequested = new EventEmitter<void>();\n\n // ---- Internal state ----\n ShowDeleteDialog = false;\n ShowDiscardDialog = false;\n\n /** Computed descendant tree for breadcrumb display */\n DescendantTree: IsaRelatedItem[] = [];\n private _lastRecordForChains: BaseEntity | null = null;\n private _chainsLoading = false;\n\n // ---- Lifecycle ----\n\n ngDoCheck(): void {\n if (this._formRef) {\n this.SyncFromFormRef();\n }\n this.CheckDescendantChains();\n }\n\n /**\n * Sync toolbar state from the legacy form reference.\n * Only active when [Form] is set (backward-compat mode).\n */\n private SyncFromFormRef(): void {\n const ref = this._formRef as Record<string, unknown>;\n const rec = ref['record'] as BaseEntity | undefined;\n let changed = false;\n\n if (rec && rec !== this.Record) {\n this.Record = rec;\n this.EntityInfo = rec.EntityInfo;\n changed = true;\n }\n\n if (rec) {\n const dirty = rec.Dirty;\n if (dirty !== this.IsDirty) {\n this.IsDirty = dirty;\n changed = true;\n }\n if (dirty) {\n const dirtyNames = rec.Fields.filter(f => f.Dirty).map(f => f.Name);\n if (dirtyNames.length !== this.DirtyFieldNames.length) {\n this.DirtyFieldNames = dirtyNames;\n changed = true;\n }\n }\n }\n\n const editMode = !!ref['EditMode'];\n if (editMode !== this.EditMode) { this.EditMode = editMode; changed = true; }\n\n const canEdit = !!ref['UserCanEdit'];\n if (canEdit !== this.UserCanEdit) { this.UserCanEdit = canEdit; changed = true; }\n\n const canDelete = !!ref['UserCanDelete'];\n if (canDelete !== this.UserCanDelete) { this.UserCanDelete = canDelete; changed = true; }\n\n const isFavorite = !!ref['IsFavorite'];\n if (isFavorite !== this.IsFavorite) { this.IsFavorite = isFavorite; changed = true; }\n\n const favDone = !!ref['FavoriteInitDone'];\n if (favDone !== this.FavoriteInitDone) { this.FavoriteInitDone = favDone; changed = true; }\n\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n\n /** Whether entity tracks record changes (for history button) */\n get TracksChanges(): boolean {\n return this.EntityInfo?.TrackRecordChanges === true;\n }\n\n /** IS-A parent chain for breadcrumb display */\n get ParentChain(): EntityInfo[] {\n if (!this.EntityInfo) return [];\n return this.EntityInfo.ParentChain.slice().reverse();\n }\n\n /** Whether this entity has parent entities (IS-A child) */\n get HasParentEntities(): boolean {\n return this.ParentChain.length > 0;\n }\n\n /** Child entity types from metadata (all possible subtypes) */\n get ChildEntities(): EntityInfo[] {\n return this.EntityInfo?.ChildEntities ?? [];\n }\n\n /** Whether this entity has child entity types (IS-A parent) */\n get HasChildEntities(): boolean {\n return this.ChildEntities.length > 0;\n }\n\n /**\n * The actual loaded IS-A child chain for the current record.\n * Walks Record.ISAChild → ISAChild.ISAChild → ... collecting each child entity.\n * This differs from ChildEntities (metadata) because it represents the SPECIFIC\n * child type that exists for THIS record, not all possible subtypes.\n *\n * For overlapping subtype parents, this is empty (ISAChild returns null) —\n * use OverlappingChildren instead.\n */\n get ChildChain(): BaseEntity[] {\n if (!this.Record) return [];\n const chain: BaseEntity[] = [];\n let current = this.Record.ISAChild;\n while (current) {\n chain.push(current);\n current = current.ISAChild;\n }\n return chain;\n }\n\n /** Whether this record has a loaded IS-A child entity */\n get HasLoadedChild(): boolean {\n return this.Record?.ISAChild != null;\n }\n\n /**\n * For overlapping subtype parents (AllowMultipleSubtypes = true), returns the\n * list of child entity type names that have records for this PK.\n * Populated by InitializeChildEntity() during record load.\n */\n get OverlappingChildren(): { entityName: string }[] {\n return this.Record?.ISAChildren ?? [];\n }\n\n /** Whether the current record has overlapping child types discovered */\n get HasOverlappingChildren(): boolean {\n return this.OverlappingChildren.length > 0;\n }\n\n /** Whether this entity is part of any IS-A hierarchy (parent or child side) */\n get IsInHierarchy(): boolean {\n return this.HasParentEntities || this.HasLoadedChild || this.HasOverlappingChildren || this.DescendantTree.length > 0;\n }\n\n /** Display-friendly names of dirty fields for the edit banner */\n get DirtyFieldDisplayNames(): string[] {\n if (!this.Record?.EntityInfo || this.DirtyFieldNames.length === 0) return [];\n return this.DirtyFieldNames.map(name => {\n const field = this.Record.EntityInfo.Fields.find(f => f.Name === name);\n return field?.DisplayNameOrName ?? name;\n });\n }\n\n /** Display name for the edit banner */\n get RecordDisplayName(): string {\n if (!this.Record) return '';\n const info = this.Record.EntityInfo;\n if (info?.NameField) {\n const name = this.Record.Get(info.NameField.Name);\n if (name) return String(name);\n }\n return this.Record.PrimaryKey.ToConcatenatedString();\n }\n\n // ---- Descendant Chain Computation ----\n\n /**\n * Check if descendant chains need recomputation (called from DoCheck).\n * Only triggers async computation when the record identity changes.\n */\n private CheckDescendantChains(): void {\n if (!this.Record) {\n if (this.DescendantTree.length > 0) {\n this.DescendantTree = [];\n this._lastRecordForChains = null;\n this.cdr.markForCheck();\n }\n return;\n }\n if (this.Record !== this._lastRecordForChains && !this._chainsLoading) {\n this.ComputeDescendantChains();\n }\n }\n\n /**\n * Asynchronously discover all IS-A descendants and convert to chains\n * for breadcrumb display. Each chain is a root-to-leaf path of entity names.\n */\n private ComputeDescendantChains(): void {\n this._lastRecordForChains = this.Record;\n\n if (!this.Record?.EntityInfo?.IsParentType) {\n this.DescendantTree = [];\n return;\n }\n\n this._chainsLoading = true;\n\n DiscoverISADescendants(this.Record).then(descendants => {\n this.DescendantTree = BuildDescendantTree(descendants);\n this._chainsLoading = false;\n this.cdr.markForCheck();\n }).catch(() => {\n this.DescendantTree = [];\n this._chainsLoading = false;\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Navigate to a descendant entity record in the IS-A hierarchy.\n */\n OnDescendantBadgeClick(entityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: entityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Actions ----\n\n OnEdit(): void {\n if (this.DispatchToFormRef('StartEditMode')) return;\n this.EditModeChange.emit(true);\n }\n\n OnSave(): void {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeSaveEventArgs(true);\n this.BeforeSave.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('SaveRecord', true)) return;\n this.SaveRequested.emit();\n });\n }\n\n OnCancel(): void {\n // If there are unsaved changes, show confirmation dialog\n if (this.IsDirty) {\n this.ShowDiscardDialog = true;\n this.cdr.markForCheck();\n return;\n }\n // No changes - cancel immediately\n this.EmitCancel();\n }\n\n OnDiscardConfirm(): void {\n this.ShowDiscardDialog = false;\n this.EmitCancel();\n this.cdr.markForCheck();\n }\n\n OnDiscardCancel(): void {\n this.ShowDiscardDialog = false;\n this.cdr.markForCheck();\n }\n\n private EmitCancel(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeCancelEventArgs();\n this.BeforeCancel.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('CancelEdit')) return;\n this.CancelRequested.emit();\n }\n\n OnDeleteClick(): void {\n this.ShowDeleteDialog = true;\n this.cdr.markForCheck();\n }\n\n OnDeleteConfirm(): void {\n this.ShowDeleteDialog = false;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeDeleteEventArgs();\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n this.cdr.markForCheck();\n return;\n }\n\n if (this.DispatchToFormRef('OnDeleteRequested')) {\n this.cdr.markForCheck();\n return;\n }\n this.DeleteRequested.emit();\n this.cdr.markForCheck();\n }\n\n OnDeleteCancel(): void {\n this.ShowDeleteDialog = false;\n this.cdr.markForCheck();\n }\n\n OnFavoriteToggle(): void {\n if (this.DispatchToFormRef('OnFavoriteToggled')) return;\n this.FavoriteToggled.emit();\n }\n\n OnHistory(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnHistoryRequested')) return;\n this.HistoryRequested.emit();\n }\n\n OnListManagement(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnListManagementRequested')) return;\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanel(): void {\n if (this.DispatchToFormRef('HandleTagsPanel')) return;\n this.TagsPanelToggled.emit();\n }\n\n OnCustomButtonClick(button: CustomToolbarButton): void {\n if (button.Disabled) return;\n\n this.CustomButtonClick.emit({\n ButtonKey: button.Key,\n Button: button\n });\n }\n\n OnShowChanges(): void {\n if (this.DispatchToFormRef('ShowChanges')) return;\n this.ShowChangesRequested.emit();\n }\n\n /**\n * Try to call a method on the legacy form reference.\n * Returns true if the method was found and called, false otherwise.\n */\n private DispatchToFormRef(methodName: string, ...args: unknown[]): boolean {\n if (!this._formRef) return false;\n const ref = this._formRef as Record<string, unknown>;\n const method = ref[methodName];\n if (typeof method === 'function') {\n (method as (...a: unknown[]) => unknown).call(this._formRef, ...args);\n return true;\n }\n return false;\n }\n\n /**\n * Navigate to a parent entity record in the IS-A hierarchy.\n */\n OnParentBadgeClick(parentEntity: EntityInfo, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: parentEntity.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'parent'\n });\n }\n\n /**\n * Navigate to a child entity type list view.\n */\n OnChildEntityClick(childEntity: EntityInfo): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'child-entity-type',\n ChildEntityName: childEntity.Name,\n ParentEntityName: this.EntityInfo!.Name,\n ParentRecordId: this.Record.PrimaryKey.ToConcatenatedString()\n });\n }\n\n /**\n * Navigate to a loaded child entity record in the IS-A hierarchy.\n * The child shares the same primary key as the parent (IS-A inheritance).\n */\n OnChildBadgeClick(childEntity: BaseEntity, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntity.EntityInfo.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n /**\n * Navigate to an overlapping child entity record.\n * Used when the parent has AllowMultipleSubtypes = true and multiple child\n * types coexist for the same PK.\n */\n OnOverlappingChildClick(childEntityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Section Controls ----\n\n OnFilterInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.FilterChange.emit(input.value);\n }\n\n OnClearFilter(): void {\n this.FilterChange.emit('');\n }\n\n OnExpandAll(): void {\n this.ExpandAllRequested.emit();\n }\n\n OnCollapseAll(): void {\n this.CollapseAllRequested.emit();\n }\n\n OnToggleEmptyFields(): void {\n this.ShowEmptyFieldsChange.emit(!this.ShowEmptyFields);\n }\n\n OnToggleWidthMode(): void {\n const newMode: FormWidthMode = this.WidthMode === 'centered' ? 'full-width' : 'centered';\n this.WidthModeChange.emit(newMode);\n }\n\n OnResetSectionOrder(): void {\n this.ResetSectionOrderRequested.emit();\n }\n\n OnManageSections(): void {\n this.ManageSectionsRequested.emit();\n }\n}\n","<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only — hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root → ... → Current → ... → Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root → ... → immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level → inline with chevron.\n Multiple children at a level → tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n"]}
1
+ {"version":3,"file":"form-toolbar.component.js","sourceRoot":"","sources":["../../../src/lib/toolbar/form-toolbar.component.ts","../../../src/lib/toolbar/form-toolbar.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, TemplateRef, ChangeDetectorRef, inject, DoCheck } from '@angular/core';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { DiscoverISADescendants, BuildDescendantTree, IsaRelatedItem } from '../isa-related-panel/isa-hierarchy-utils';\nimport { FormWidthMode, FormContext } from '../types/form-types';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs,\n CustomToolbarButton\n} from '../types/form-events';\n\n/**\n * Configurable form toolbar component.\n *\n * Renders action buttons (edit, save, delete, favorite, history, lists),\n * the IS-A entity hierarchy breadcrumb, and section controls (search, expand/collapse).\n *\n * All navigation actions are emitted as events - the toolbar never calls any routing\n * service directly. The host application subscribes and maps to its own navigation.\n *\n * @example\n * ```html\n * <mj-form-toolbar\n * [record]=\"record\"\n * [editMode]=\"editMode\"\n * [config]=\"toolbarConfig\"\n * (Navigate)=\"onNavigate($event)\"\n * (EditModeChange)=\"editMode = $event\"\n * (SaveRequested)=\"onSave()\"\n * (DeleteRequested)=\"onDelete()\">\n * </mj-form-toolbar>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-toolbar.component.html',\n styleUrls: ['./form-toolbar.component.css']\n})\nexport class MjFormToolbarComponent implements DoCheck {\n private cdr = inject(ChangeDetectorRef);\n\n // ---- Deprecated form reference (backward compat) ----\n\n private _formRef: unknown;\n\n /**\n * @deprecated Use `<mj-record-form-container>` or pass individual inputs instead.\n * Accepts a form component reference for backward compatibility.\n * When set, the toolbar reads Record, EditMode, etc. from this reference.\n */\n @Input() set Form(value: unknown) { this._formRef = value; }\n get Form(): unknown { return this._formRef; }\n\n /** @deprecated Use [Form] or individual inputs instead */\n @Input('form') set _deprecatedForm(value: unknown) { this.Form = value; }\n\n // ---- Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** Whether the current user has edit permission */\n @Input() UserCanEdit = false;\n\n /** Whether the current user has delete permission */\n @Input() UserCanDelete = false;\n\n /** Whether the record is currently a favorite */\n @Input() IsFavorite = false;\n\n /** Whether favorite init has completed (prevents flash of wrong icon) */\n @Input() FavoriteInitDone = false;\n\n /** Whether the record has unsaved changes */\n @Input() IsDirty = false;\n\n /** Names of dirty fields for display in save bar */\n @Input() DirtyFieldNames: string[] = [];\n\n /** Count of lists this record belongs to */\n @Input() ListCount = 0;\n\n /** Number of tags applied to this record */\n @Input() TagCount = 0;\n\n /** Whether the tags panel is currently open */\n @Input() IsTagsPanelOpen = false;\n\n /** Number of record change versions for this record (displayed as \"vN\" badge on history button) */\n @Input() VersionCount = 0;\n\n /** Entity info for IS-A hierarchy and metadata */\n @Input() EntityInfo: EntityInfo | null = null;\n\n /** Toolbar configuration controlling visibility and behavior */\n @Input() Config: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n\n /** Whether to show the toolbar in a saving/loading state */\n @Input() IsSaving = false;\n\n // Section controls inputs\n @Input() VisibleSectionCount = 0;\n @Input() TotalSectionCount = 0;\n @Input() ExpandedSectionCount = 0;\n @Input() SearchFilter = '';\n @Input() ShowEmptyFields = false;\n @Input() WidthMode: FormWidthMode = 'centered';\n @Input() HasCustomSectionOrder = false;\n\n /** Optional template for additional toolbar actions */\n @Input() AdditionalActionsTemplate: TemplateRef<unknown> | null = null;\n\n /**\n * Available form variants for this entity. When the array has >1 entry\n * and `Config.ShowFormVariantPicker` is true, the toolbar renders a\n * right-side \"form picker\" button (icon) that opens a dropdown with\n * the Default form + each variant. Picking emits {@link VariantPicked}\n * with the override ID, or null for the CodeGen Angular default.\n *\n * Shape is intentionally minimal — Generic doesn't depend on the\n * resolver row type. Hosts shape their data into this. See\n * {@link VariantPickerItem} on the container for the canonical shape.\n */\n @Input() Variants: Array<{ ID: string; Label: string; Scope: 'User' | 'Role' | 'Global'; Status: 'Active' | 'Pending' | 'Inactive' }> = [];\n\n /** The currently-applied variant ID, or null when the Default form is active. */\n @Input() CurrentVariantID: string | null = null;\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (record links, hierarchy clicks, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Request to enter or exit edit mode */\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 /** Request to save the current record */\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 /** Request to cancel editing and revert changes */\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 /** Request to delete the current record */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Request to toggle favorite status */\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 /** Request to show record change history */\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 /** Request to show list management */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when the Tags button is clicked */\n @Output() TagsPanelToggled = new EventEmitter<void>();\n\n /** Request to show dirty field changes */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the user picks an item from the form-variant dropdown.\n * Payload is the override ID for a specific variant, or `null` when the\n * user picks the \"Default form\" row (CodeGen / Angular fallback).\n */\n @Output() VariantPicked = new EventEmitter<string | null>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n // Section control outputs\n @Output() FilterChange = new EventEmitter<string>();\n @Output() ExpandAllRequested = new EventEmitter<void>();\n @Output() CollapseAllRequested = new EventEmitter<void>();\n @Output() ShowEmptyFieldsChange = new EventEmitter<boolean>();\n @Output() WidthModeChange = new EventEmitter<FormWidthMode>();\n @Output() ResetSectionOrderRequested = new EventEmitter<void>();\n @Output() ManageSectionsRequested = new EventEmitter<void>();\n\n // ---- Internal state ----\n ShowDeleteDialog = false;\n ShowDiscardDialog = false;\n\n /** Computed descendant tree for breadcrumb display */\n DescendantTree: IsaRelatedItem[] = [];\n private _lastRecordForChains: BaseEntity | null = null;\n private _chainsLoading = false;\n\n // ---- Lifecycle ----\n\n ngDoCheck(): void {\n if (this._formRef) {\n this.SyncFromFormRef();\n }\n this.CheckDescendantChains();\n }\n\n /**\n * Sync toolbar state from the legacy form reference.\n * Only active when [Form] is set (backward-compat mode).\n */\n private SyncFromFormRef(): void {\n const ref = this._formRef as Record<string, unknown>;\n const rec = ref['record'] as BaseEntity | undefined;\n let changed = false;\n\n if (rec && rec !== this.Record) {\n this.Record = rec;\n this.EntityInfo = rec.EntityInfo;\n changed = true;\n }\n\n if (rec) {\n const dirty = rec.Dirty;\n if (dirty !== this.IsDirty) {\n this.IsDirty = dirty;\n changed = true;\n }\n if (dirty) {\n const dirtyNames = rec.Fields.filter(f => f.Dirty).map(f => f.Name);\n if (dirtyNames.length !== this.DirtyFieldNames.length) {\n this.DirtyFieldNames = dirtyNames;\n changed = true;\n }\n }\n }\n\n const editMode = !!ref['EditMode'];\n if (editMode !== this.EditMode) { this.EditMode = editMode; changed = true; }\n\n const canEdit = !!ref['UserCanEdit'];\n if (canEdit !== this.UserCanEdit) { this.UserCanEdit = canEdit; changed = true; }\n\n const canDelete = !!ref['UserCanDelete'];\n if (canDelete !== this.UserCanDelete) { this.UserCanDelete = canDelete; changed = true; }\n\n const isFavorite = !!ref['IsFavorite'];\n if (isFavorite !== this.IsFavorite) { this.IsFavorite = isFavorite; changed = true; }\n\n const favDone = !!ref['FavoriteInitDone'];\n if (favDone !== this.FavoriteInitDone) { this.FavoriteInitDone = favDone; changed = true; }\n\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n\n /** Whether entity tracks record changes (for history button) */\n get TracksChanges(): boolean {\n return this.EntityInfo?.TrackRecordChanges === true;\n }\n\n /** IS-A parent chain for breadcrumb display */\n get ParentChain(): EntityInfo[] {\n if (!this.EntityInfo) return [];\n return this.EntityInfo.ParentChain.slice().reverse();\n }\n\n /** Whether this entity has parent entities (IS-A child) */\n get HasParentEntities(): boolean {\n return this.ParentChain.length > 0;\n }\n\n /** Child entity types from metadata (all possible subtypes) */\n get ChildEntities(): EntityInfo[] {\n return this.EntityInfo?.ChildEntities ?? [];\n }\n\n /** Whether this entity has child entity types (IS-A parent) */\n get HasChildEntities(): boolean {\n return this.ChildEntities.length > 0;\n }\n\n /**\n * The actual loaded IS-A child chain for the current record.\n * Walks Record.ISAChild → ISAChild.ISAChild → ... collecting each child entity.\n * This differs from ChildEntities (metadata) because it represents the SPECIFIC\n * child type that exists for THIS record, not all possible subtypes.\n *\n * For overlapping subtype parents, this is empty (ISAChild returns null) —\n * use OverlappingChildren instead.\n */\n get ChildChain(): BaseEntity[] {\n if (!this.Record) return [];\n const chain: BaseEntity[] = [];\n let current = this.Record.ISAChild;\n while (current) {\n chain.push(current);\n current = current.ISAChild;\n }\n return chain;\n }\n\n /** Whether this record has a loaded IS-A child entity */\n get HasLoadedChild(): boolean {\n return this.Record?.ISAChild != null;\n }\n\n /**\n * For overlapping subtype parents (AllowMultipleSubtypes = true), returns the\n * list of child entity type names that have records for this PK.\n * Populated by InitializeChildEntity() during record load.\n */\n get OverlappingChildren(): { entityName: string }[] {\n return this.Record?.ISAChildren ?? [];\n }\n\n /** Whether the current record has overlapping child types discovered */\n get HasOverlappingChildren(): boolean {\n return this.OverlappingChildren.length > 0;\n }\n\n /** Whether this entity is part of any IS-A hierarchy (parent or child side) */\n get IsInHierarchy(): boolean {\n return this.HasParentEntities || this.HasLoadedChild || this.HasOverlappingChildren || this.DescendantTree.length > 0;\n }\n\n /** Display-friendly names of dirty fields for the edit banner */\n get DirtyFieldDisplayNames(): string[] {\n if (!this.Record?.EntityInfo || this.DirtyFieldNames.length === 0) return [];\n return this.DirtyFieldNames.map(name => {\n const field = this.Record.EntityInfo.Fields.find(f => f.Name === name);\n return field?.DisplayNameOrName ?? name;\n });\n }\n\n /** Display name for the edit banner */\n get RecordDisplayName(): string {\n if (!this.Record) return '';\n const info = this.Record.EntityInfo;\n if (info?.NameField) {\n const name = this.Record.Get(info.NameField.Name);\n if (name) return String(name);\n }\n return this.Record.PrimaryKey.ToConcatenatedString();\n }\n\n // ---- Descendant Chain Computation ----\n\n /**\n * Check if descendant chains need recomputation (called from DoCheck).\n * Only triggers async computation when the record identity changes.\n */\n private CheckDescendantChains(): void {\n if (!this.Record) {\n if (this.DescendantTree.length > 0) {\n this.DescendantTree = [];\n this._lastRecordForChains = null;\n this.cdr.markForCheck();\n }\n return;\n }\n if (this.Record !== this._lastRecordForChains && !this._chainsLoading) {\n this.ComputeDescendantChains();\n }\n }\n\n /**\n * Asynchronously discover all IS-A descendants and convert to chains\n * for breadcrumb display. Each chain is a root-to-leaf path of entity names.\n */\n private ComputeDescendantChains(): void {\n this._lastRecordForChains = this.Record;\n\n if (!this.Record?.EntityInfo?.IsParentType) {\n this.DescendantTree = [];\n return;\n }\n\n this._chainsLoading = true;\n\n DiscoverISADescendants(this.Record).then(descendants => {\n this.DescendantTree = BuildDescendantTree(descendants);\n this._chainsLoading = false;\n this.cdr.markForCheck();\n }).catch(() => {\n this.DescendantTree = [];\n this._chainsLoading = false;\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Navigate to a descendant entity record in the IS-A hierarchy.\n */\n OnDescendantBadgeClick(entityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: entityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Actions ----\n\n OnEdit(): void {\n if (this.DispatchToFormRef('StartEditMode')) return;\n this.EditModeChange.emit(true);\n }\n\n OnSave(): void {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeSaveEventArgs(true);\n this.BeforeSave.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('SaveRecord', true)) return;\n this.SaveRequested.emit();\n });\n }\n\n OnCancel(): void {\n // If there are unsaved changes, show confirmation dialog\n if (this.IsDirty) {\n this.ShowDiscardDialog = true;\n this.cdr.markForCheck();\n return;\n }\n // No changes - cancel immediately\n this.EmitCancel();\n }\n\n OnDiscardConfirm(): void {\n this.ShowDiscardDialog = false;\n this.EmitCancel();\n this.cdr.markForCheck();\n }\n\n OnDiscardCancel(): void {\n this.ShowDiscardDialog = false;\n this.cdr.markForCheck();\n }\n\n private EmitCancel(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeCancelEventArgs();\n this.BeforeCancel.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('CancelEdit')) return;\n this.CancelRequested.emit();\n }\n\n OnDeleteClick(): void {\n this.ShowDeleteDialog = true;\n this.cdr.markForCheck();\n }\n\n OnDeleteConfirm(): void {\n this.ShowDeleteDialog = false;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeDeleteEventArgs();\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n this.cdr.markForCheck();\n return;\n }\n\n if (this.DispatchToFormRef('OnDeleteRequested')) {\n this.cdr.markForCheck();\n return;\n }\n this.DeleteRequested.emit();\n this.cdr.markForCheck();\n }\n\n OnDeleteCancel(): void {\n this.ShowDeleteDialog = false;\n this.cdr.markForCheck();\n }\n\n OnFavoriteToggle(): void {\n if (this.DispatchToFormRef('OnFavoriteToggled')) return;\n this.FavoriteToggled.emit();\n }\n\n OnHistory(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnHistoryRequested')) return;\n this.HistoryRequested.emit();\n }\n\n OnListManagement(): void {\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('OnListManagementRequested')) return;\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanel(): void {\n if (this.DispatchToFormRef('HandleTagsPanel')) return;\n this.TagsPanelToggled.emit();\n }\n\n OnCustomButtonClick(button: CustomToolbarButton): void {\n if (button.Disabled) return;\n\n this.CustomButtonClick.emit({\n ButtonKey: button.Key,\n Button: button\n });\n }\n\n OnShowChanges(): void {\n if (this.DispatchToFormRef('ShowChanges')) return;\n this.ShowChangesRequested.emit();\n }\n\n // ── Form-variant picker ─────────────────────────────────────────\n\n /** Whether the variant-picker dropdown is currently open. */\n public VariantMenuOpen = false;\n\n /**\n * True iff the toolbar should render the variant-picker button.\n *\n * Note the threshold is `>= 1`, NOT `> 1`. The picker menu always\n * includes the \"Default form\" row (CodeGen / Angular fallback) — that\n * row isn't in {@link Variants}; it's rendered unconditionally as the\n * first row inside the menu. So any single variant still yields a real\n * choice (Default vs that variant) and the picker should appear. The\n * inline-strip implementation that this replaces used `> 1` and\n * therefore hid the picker for entities with exactly one override,\n * which made that override unreachable from the UI.\n */\n public get ShowVariantPickerButton(): boolean {\n return !!this.Config.ShowFormVariantPicker && (this.Variants?.length ?? 0) >= 1;\n }\n\n /** Label for the currently-active variant, or \"Default form\" when none. */\n public get CurrentVariantLabel(): string {\n const v = this.Variants?.find(x => UUIDsEqual(x.ID, this.CurrentVariantID));\n return v?.Label ?? 'Default form';\n }\n\n /** Compact subtitle for a variant menu row: \"Scope · Status\". */\n public VariantSubtitle(v: { Scope: string; Status: string }): string {\n return `${v.Scope} · ${v.Status}`;\n }\n\n public ToggleVariantMenu(): void {\n this.VariantMenuOpen = !this.VariantMenuOpen;\n this.cdr.markForCheck();\n }\n\n public CloseVariantMenu(): void {\n if (this.VariantMenuOpen) {\n this.VariantMenuOpen = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * User picked a row in the variant menu. Closes the menu and emits\n * `VariantPicked` (null → \"Default form\" / CodeGen Angular; UUID →\n * specific override). No-op when the picked value matches the current.\n */\n public OnVariantClick(variantID: string | null): void {\n this.VariantMenuOpen = false;\n if (variantID === this.CurrentVariantID) {\n this.cdr.markForCheck();\n return;\n }\n this.VariantPicked.emit(variantID);\n }\n\n /**\n * Try to call a method on the legacy form reference.\n * Returns true if the method was found and called, false otherwise.\n */\n private DispatchToFormRef(methodName: string, ...args: unknown[]): boolean {\n if (!this._formRef) return false;\n const ref = this._formRef as Record<string, unknown>;\n const method = ref[methodName];\n if (typeof method === 'function') {\n (method as (...a: unknown[]) => unknown).call(this._formRef, ...args);\n return true;\n }\n return false;\n }\n\n /**\n * Navigate to a parent entity record in the IS-A hierarchy.\n */\n OnParentBadgeClick(parentEntity: EntityInfo, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: parentEntity.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'parent'\n });\n }\n\n /**\n * Navigate to a child entity type list view.\n */\n OnChildEntityClick(childEntity: EntityInfo): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'child-entity-type',\n ChildEntityName: childEntity.Name,\n ParentEntityName: this.EntityInfo!.Name,\n ParentRecordId: this.Record.PrimaryKey.ToConcatenatedString()\n });\n }\n\n /**\n * Navigate to a loaded child entity record in the IS-A hierarchy.\n * The child shares the same primary key as the parent (IS-A inheritance).\n */\n OnChildBadgeClick(childEntity: BaseEntity, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntity.EntityInfo.Name,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n /**\n * Navigate to an overlapping child entity record.\n * Used when the parent has AllowMultipleSubtypes = true and multiple child\n * types coexist for the same PK.\n */\n OnOverlappingChildClick(childEntityName: string, event: MouseEvent): void {\n if (!this.Record) return;\n this.Navigate.emit({\n Kind: 'entity-hierarchy',\n EntityName: childEntityName,\n PrimaryKey: this.Record.PrimaryKey,\n Direction: 'child'\n });\n }\n\n // ---- Section Controls ----\n\n OnFilterInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.FilterChange.emit(input.value);\n }\n\n OnClearFilter(): void {\n this.FilterChange.emit('');\n }\n\n OnExpandAll(): void {\n this.ExpandAllRequested.emit();\n }\n\n OnCollapseAll(): void {\n this.CollapseAllRequested.emit();\n }\n\n OnToggleEmptyFields(): void {\n this.ShowEmptyFieldsChange.emit(!this.ShowEmptyFields);\n }\n\n OnToggleWidthMode(): void {\n const newMode: FormWidthMode = this.WidthMode === 'centered' ? 'full-width' : 'centered';\n this.WidthModeChange.emit(newMode);\n }\n\n OnResetSectionOrder(): void {\n this.ResetSectionOrderRequested.emit();\n }\n\n OnManageSections(): void {\n this.ManageSectionsRequested.emit();\n }\n}\n","<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only — hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root → ... → Current → ... → Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root → ... → immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Form-variant picker: right-side toolbar button. Opens a dropdown\n with the Default (CodeGen Angular) form + every variant the host\n supplied. Persists the user's pick via the host's resolver (which\n goes through UserInfoEngine settings, not localStorage). Hidden\n entirely when the host disables ShowFormVariantPicker or supplied\n fewer than 2 variants. -->\n @if (ShowVariantPickerButton) {\n <div class=\"mj-form-variant-picker-host\"\n [class.open]=\"VariantMenuOpen\">\n <button class=\"mj-forms-btn mj-form-variant-picker-trigger\"\n type=\"button\"\n (click)=\"ToggleVariantMenu()\"\n (blur)=\"CloseVariantMenu()\"\n [title]=\"'Form variant: ' + CurrentVariantLabel + ' — click to change'\">\n <i class=\"fa-solid fa-pen-ruler\"></i>\n <span class=\"mj-form-variant-picker-current-label\">{{ CurrentVariantLabel }}</span>\n <i class=\"fa-solid fa-chevron-down chev\"></i>\n </button>\n @if (VariantMenuOpen) {\n <div class=\"mj-form-variant-picker-menu\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"mj-form-variant-picker-row mj-form-variant-picker-default\"\n [class.current]=\"!CurrentVariantID\"\n (click)=\"OnVariantClick(null)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">\n Default form <span class=\"mj-form-variant-picker-default-tag\">(default)</span>\n </span>\n <span class=\"mj-form-variant-picker-row-sub\">CodeGen-generated Angular fallback</span>\n </div>\n @if (!CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n @for (v of Variants; track v.ID) {\n <div class=\"mj-form-variant-picker-row\"\n [class.current]=\"v.ID === CurrentVariantID\"\n [class.inactive]=\"v.Status !== 'Active'\"\n (click)=\"OnVariantClick(v.ID)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">{{ v.Label }}</span>\n <span class=\"mj-form-variant-picker-row-sub\">{{ VariantSubtitle(v) }}</span>\n </div>\n @if (v.ID === CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level → inline with chevron.\n Multiple children at a level → tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n"]}
@@ -0,0 +1,125 @@
1
+ import { FormToolbarConfig } from './toolbar-config';
2
+ import { FormWidthMode } from './form-types';
3
+ /**
4
+ * Per-instance configuration for an MemberJunction entity form, independent of
5
+ * how it is presented (full-page tab, modal dialog, or slide-in panel).
6
+ *
7
+ * Set on {@link BaseFormComponent.Config}. The record-form container and the
8
+ * collapsible panels read it back through the `FormComponent` reference, so it
9
+ * takes effect **without regenerating** the CodeGen-produced form template.
10
+ *
11
+ * Every field is optional; an omitted field falls back to the value the host
12
+ * surface seeds (see {@link TAB_FORM_CONFIG}, {@link DIALOG_FORM_CONFIG},
13
+ * {@link SLIDEIN_FORM_CONFIG}).
14
+ *
15
+ * This interface is intentionally additive — new optional knobs can be added
16
+ * over time without breaking existing consumers or presets.
17
+ *
18
+ * @example Hide related grids + lock sections open in a dialog
19
+ * ```typescript
20
+ * host.Config = {
21
+ * ...DIALOG_FORM_CONFIG,
22
+ * ShowRelatedEntities: false,
23
+ * CollapsibleSections: false,
24
+ * Toolbar: { ShowDeleteButton: false },
25
+ * };
26
+ * ```
27
+ */
28
+ export interface EntityFormConfig {
29
+ /**
30
+ * Toolbar configuration.
31
+ * - `undefined` → use the surface default (full toolbar on tabs).
32
+ * - `null` → render **no toolbar at all** (default for dialog & slide-in,
33
+ * where the chrome owns the title and Save/Cancel buttons).
34
+ * - `Partial<FormToolbarConfig>` → merged over the surface default config.
35
+ */
36
+ Toolbar?: Partial<FormToolbarConfig> | null;
37
+ /**
38
+ * Whether related-entity grid sections (panels with `Variant="related-entity"`)
39
+ * are shown. Default: `true` on tabs, `false` in dialog/slide-in.
40
+ */
41
+ ShowRelatedEntities?: boolean;
42
+ /**
43
+ * Whether section headers can collapse/expand. When `false`, every section
44
+ * renders always-expanded with no toggle chevron. Default: `true`.
45
+ */
46
+ CollapsibleSections?: boolean;
47
+ /**
48
+ * Hide specific sections by their `sectionKey` (field OR related-entity).
49
+ * Mutually exclusive with {@link VisibleSectionKeys}; if both are set,
50
+ * `VisibleSectionKeys` wins.
51
+ */
52
+ HiddenSectionKeys?: string[];
53
+ /**
54
+ * Allow-list of `sectionKey`s to render — every other section is hidden.
55
+ * Mutually exclusive with {@link HiddenSectionKeys}.
56
+ */
57
+ VisibleSectionKeys?: string[];
58
+ /**
59
+ * Initial width mode for the form body. Default: `'centered'` on tabs,
60
+ * `'full-width'` in a slide-in.
61
+ */
62
+ WidthMode?: FormWidthMode;
63
+ /**
64
+ * Whether in-form record links emit `Navigate` events. The form host NEVER
65
+ * routes; it only emits, and the consumer decides what to do. Default:
66
+ * `true` on tabs, `false` in dialog/slide-in (links render inert so a modal
67
+ * context doesn't teleport the user away).
68
+ */
69
+ EnableRecordLinks?: boolean;
70
+ /**
71
+ * Force the form to start in edit mode. When omitted, the host starts new
72
+ * records in edit mode and existing records in read mode.
73
+ */
74
+ StartInEditMode?: boolean;
75
+ }
76
+ /**
77
+ * Default config for a full-page (tab) form: full toolbar, related grids
78
+ * visible, collapsible sections, in-form links live. Equivalent to passing no
79
+ * config at all — provided for explicitness and as a merge base.
80
+ */
81
+ export declare const TAB_FORM_CONFIG: EntityFormConfig;
82
+ /**
83
+ * Default config for an entity form presented in a modal dialog: no in-form
84
+ * toolbar (the dialog footer owns Save/Cancel), related grids hidden to keep
85
+ * the dialog focused, sections collapsible, in-form links inert.
86
+ */
87
+ export declare const DIALOG_FORM_CONFIG: EntityFormConfig;
88
+ /**
89
+ * Default config for an entity form presented in a slide-in panel: same as the
90
+ * dialog default but full-width to use the panel's vertical real estate.
91
+ */
92
+ export declare const SLIDEIN_FORM_CONFIG: EntityFormConfig;
93
+ /**
94
+ * Whether the in-form toolbar should render for the given config. An explicit
95
+ * `Toolbar: null` (dialog/slide-in default) hides it entirely; anything else
96
+ * (undefined or a partial config) keeps it.
97
+ */
98
+ export declare function ResolveFormShowToolbar(config: EntityFormConfig | null | undefined): boolean;
99
+ /**
100
+ * Merge a config's `Toolbar` partial over a base toolbar config. Returns `base`
101
+ * unchanged when there's no override (or it's `null`).
102
+ */
103
+ export declare function ResolveFormToolbarConfig(base: FormToolbarConfig, config: EntityFormConfig | null | undefined): FormToolbarConfig;
104
+ /**
105
+ * Minimal structural shape of the section-visibility rules. Both
106
+ * {@link EntityFormConfig} and `FormContext` satisfy this, so the same helper
107
+ * works whether driven by config directly or via the form context that reaches
108
+ * every panel (including slot-injected `BaseFormPanel`s).
109
+ *
110
+ * Note: these property names stay camelCase to match the structural
111
+ * {@link FormContext} interface that panels actually receive at runtime.
112
+ */
113
+ export interface SectionVisibilityRules {
114
+ showRelatedEntities?: boolean;
115
+ hiddenSectionKeys?: string[];
116
+ visibleSectionKeys?: string[];
117
+ }
118
+ /**
119
+ * Whether a section should be hidden given the visibility rules:
120
+ * - `visibleSectionKeys` (allow-list) hides anything not listed;
121
+ * - else `hiddenSectionKeys` hides the listed keys;
122
+ * - `showRelatedEntities === false` additionally hides related-entity panels.
123
+ */
124
+ export declare function IsFormSectionHidden(config: SectionVisibilityRules | null | undefined, sectionKey: string, variant: string | undefined): boolean;
125
+ //# sourceMappingURL=entity-form-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-form-config.d.ts","sourceRoot":"","sources":["../../../src/lib/types/entity-form-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAE5C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,gBAM7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBAMhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,gBAMjC,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAC1C,iBAAiB,CAGnB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,EACjD,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAWT"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Default config for a full-page (tab) form: full toolbar, related grids
3
+ * visible, collapsible sections, in-form links live. Equivalent to passing no
4
+ * config at all — provided for explicitness and as a merge base.
5
+ */
6
+ export const TAB_FORM_CONFIG = {
7
+ Toolbar: undefined,
8
+ ShowRelatedEntities: true,
9
+ CollapsibleSections: true,
10
+ WidthMode: 'centered',
11
+ EnableRecordLinks: true,
12
+ };
13
+ /**
14
+ * Default config for an entity form presented in a modal dialog: no in-form
15
+ * toolbar (the dialog footer owns Save/Cancel), related grids hidden to keep
16
+ * the dialog focused, sections collapsible, in-form links inert.
17
+ */
18
+ export const DIALOG_FORM_CONFIG = {
19
+ Toolbar: null,
20
+ ShowRelatedEntities: false,
21
+ CollapsibleSections: true,
22
+ WidthMode: 'centered',
23
+ EnableRecordLinks: false,
24
+ };
25
+ /**
26
+ * Default config for an entity form presented in a slide-in panel: same as the
27
+ * dialog default but full-width to use the panel's vertical real estate.
28
+ */
29
+ export const SLIDEIN_FORM_CONFIG = {
30
+ Toolbar: null,
31
+ ShowRelatedEntities: false,
32
+ CollapsibleSections: true,
33
+ WidthMode: 'full-width',
34
+ EnableRecordLinks: false,
35
+ };
36
+ // ── Pure resolution helpers (used by the record-form container; unit-tested) ──
37
+ /**
38
+ * Whether the in-form toolbar should render for the given config. An explicit
39
+ * `Toolbar: null` (dialog/slide-in default) hides it entirely; anything else
40
+ * (undefined or a partial config) keeps it.
41
+ */
42
+ export function ResolveFormShowToolbar(config) {
43
+ return config?.Toolbar !== null;
44
+ }
45
+ /**
46
+ * Merge a config's `Toolbar` partial over a base toolbar config. Returns `base`
47
+ * unchanged when there's no override (or it's `null`).
48
+ */
49
+ export function ResolveFormToolbarConfig(base, config) {
50
+ const override = config?.Toolbar;
51
+ return override ? { ...base, ...override } : base;
52
+ }
53
+ /**
54
+ * Whether a section should be hidden given the visibility rules:
55
+ * - `visibleSectionKeys` (allow-list) hides anything not listed;
56
+ * - else `hiddenSectionKeys` hides the listed keys;
57
+ * - `showRelatedEntities === false` additionally hides related-entity panels.
58
+ */
59
+ export function IsFormSectionHidden(config, sectionKey, variant) {
60
+ if (!config)
61
+ return false;
62
+ const allow = config.visibleSectionKeys;
63
+ const hide = config.hiddenSectionKeys;
64
+ if (allow && allow.length > 0) {
65
+ if (!allow.includes(sectionKey))
66
+ return true;
67
+ }
68
+ else if (hide && hide.includes(sectionKey)) {
69
+ return true;
70
+ }
71
+ if (config.showRelatedEntities === false && variant === 'related-entity')
72
+ return true;
73
+ return false;
74
+ }
75
+ //# sourceMappingURL=entity-form-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-form-config.js","sourceRoot":"","sources":["../../../src/lib/types/entity-form-config.ts"],"names":[],"mappings":"AAoFA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,OAAO,EAAE,SAAS;IAClB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,SAAS,EAAE,UAAU;IACrB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAqB;IAClD,OAAO,EAAE,IAAI;IACb,mBAAmB,EAAE,KAAK;IAC1B,mBAAmB,EAAE,IAAI;IACzB,SAAS,EAAE,UAAU;IACrB,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAqB;IACnD,OAAO,EAAE,IAAI;IACb,mBAAmB,EAAE,KAAK;IAC1B,mBAAmB,EAAE,IAAI;IACzB,SAAS,EAAE,YAAY;IACvB,iBAAiB,EAAE,KAAK;CACzB,CAAC;AAEF,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA2C;IAChF,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAuB,EACvB,MAA2C;IAE3C,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC;IACjC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAiBD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiD,EACjD,UAAkB,EAClB,OAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACtC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;IAC/C,CAAC;SAAM,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,mBAAmB,KAAK,KAAK,IAAI,OAAO,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACtF,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { FormToolbarConfig } from './toolbar-config';\nimport { FormWidthMode } from './form-types';\n\n/**\n * Per-instance configuration for an MemberJunction entity form, independent of\n * how it is presented (full-page tab, modal dialog, or slide-in panel).\n *\n * Set on {@link BaseFormComponent.Config}. The record-form container and the\n * collapsible panels read it back through the `FormComponent` reference, so it\n * takes effect **without regenerating** the CodeGen-produced form template.\n *\n * Every field is optional; an omitted field falls back to the value the host\n * surface seeds (see {@link TAB_FORM_CONFIG}, {@link DIALOG_FORM_CONFIG},\n * {@link SLIDEIN_FORM_CONFIG}).\n *\n * This interface is intentionally additive — new optional knobs can be added\n * over time without breaking existing consumers or presets.\n *\n * @example Hide related grids + lock sections open in a dialog\n * ```typescript\n * host.Config = {\n * ...DIALOG_FORM_CONFIG,\n * ShowRelatedEntities: false,\n * CollapsibleSections: false,\n * Toolbar: { ShowDeleteButton: false },\n * };\n * ```\n */\nexport interface EntityFormConfig {\n /**\n * Toolbar configuration.\n * - `undefined` → use the surface default (full toolbar on tabs).\n * - `null` → render **no toolbar at all** (default for dialog & slide-in,\n * where the chrome owns the title and Save/Cancel buttons).\n * - `Partial<FormToolbarConfig>` → merged over the surface default config.\n */\n Toolbar?: Partial<FormToolbarConfig> | null;\n\n /**\n * Whether related-entity grid sections (panels with `Variant=\"related-entity\"`)\n * are shown. Default: `true` on tabs, `false` in dialog/slide-in.\n */\n ShowRelatedEntities?: boolean;\n\n /**\n * Whether section headers can collapse/expand. When `false`, every section\n * renders always-expanded with no toggle chevron. Default: `true`.\n */\n CollapsibleSections?: boolean;\n\n /**\n * Hide specific sections by their `sectionKey` (field OR related-entity).\n * Mutually exclusive with {@link VisibleSectionKeys}; if both are set,\n * `VisibleSectionKeys` wins.\n */\n HiddenSectionKeys?: string[];\n\n /**\n * Allow-list of `sectionKey`s to render — every other section is hidden.\n * Mutually exclusive with {@link HiddenSectionKeys}.\n */\n VisibleSectionKeys?: string[];\n\n /**\n * Initial width mode for the form body. Default: `'centered'` on tabs,\n * `'full-width'` in a slide-in.\n */\n WidthMode?: FormWidthMode;\n\n /**\n * Whether in-form record links emit `Navigate` events. The form host NEVER\n * routes; it only emits, and the consumer decides what to do. Default:\n * `true` on tabs, `false` in dialog/slide-in (links render inert so a modal\n * context doesn't teleport the user away).\n */\n EnableRecordLinks?: boolean;\n\n /**\n * Force the form to start in edit mode. When omitted, the host starts new\n * records in edit mode and existing records in read mode.\n */\n StartInEditMode?: boolean;\n}\n\n/**\n * Default config for a full-page (tab) form: full toolbar, related grids\n * visible, collapsible sections, in-form links live. Equivalent to passing no\n * config at all — provided for explicitness and as a merge base.\n */\nexport const TAB_FORM_CONFIG: EntityFormConfig = {\n Toolbar: undefined,\n ShowRelatedEntities: true,\n CollapsibleSections: true,\n WidthMode: 'centered',\n EnableRecordLinks: true,\n};\n\n/**\n * Default config for an entity form presented in a modal dialog: no in-form\n * toolbar (the dialog footer owns Save/Cancel), related grids hidden to keep\n * the dialog focused, sections collapsible, in-form links inert.\n */\nexport const DIALOG_FORM_CONFIG: EntityFormConfig = {\n Toolbar: null,\n ShowRelatedEntities: false,\n CollapsibleSections: true,\n WidthMode: 'centered',\n EnableRecordLinks: false,\n};\n\n/**\n * Default config for an entity form presented in a slide-in panel: same as the\n * dialog default but full-width to use the panel's vertical real estate.\n */\nexport const SLIDEIN_FORM_CONFIG: EntityFormConfig = {\n Toolbar: null,\n ShowRelatedEntities: false,\n CollapsibleSections: true,\n WidthMode: 'full-width',\n EnableRecordLinks: false,\n};\n\n// ── Pure resolution helpers (used by the record-form container; unit-tested) ──\n\n/**\n * Whether the in-form toolbar should render for the given config. An explicit\n * `Toolbar: null` (dialog/slide-in default) hides it entirely; anything else\n * (undefined or a partial config) keeps it.\n */\nexport function ResolveFormShowToolbar(config: EntityFormConfig | null | undefined): boolean {\n return config?.Toolbar !== null;\n}\n\n/**\n * Merge a config's `Toolbar` partial over a base toolbar config. Returns `base`\n * unchanged when there's no override (or it's `null`).\n */\nexport function ResolveFormToolbarConfig(\n base: FormToolbarConfig,\n config: EntityFormConfig | null | undefined,\n): FormToolbarConfig {\n const override = config?.Toolbar;\n return override ? { ...base, ...override } : base;\n}\n\n/**\n * Minimal structural shape of the section-visibility rules. Both\n * {@link EntityFormConfig} and `FormContext` satisfy this, so the same helper\n * works whether driven by config directly or via the form context that reaches\n * every panel (including slot-injected `BaseFormPanel`s).\n *\n * Note: these property names stay camelCase to match the structural\n * {@link FormContext} interface that panels actually receive at runtime.\n */\nexport interface SectionVisibilityRules {\n showRelatedEntities?: boolean;\n hiddenSectionKeys?: string[];\n visibleSectionKeys?: string[];\n}\n\n/**\n * Whether a section should be hidden given the visibility rules:\n * - `visibleSectionKeys` (allow-list) hides anything not listed;\n * - else `hiddenSectionKeys` hides the listed keys;\n * - `showRelatedEntities === false` additionally hides related-entity panels.\n */\nexport function IsFormSectionHidden(\n config: SectionVisibilityRules | null | undefined,\n sectionKey: string,\n variant: string | undefined,\n): boolean {\n if (!config) return false;\n const allow = config.visibleSectionKeys;\n const hide = config.hiddenSectionKeys;\n if (allow && allow.length > 0) {\n if (!allow.includes(sectionKey)) return true;\n } else if (hide && hide.includes(sectionKey)) {\n return true;\n }\n if (config.showRelatedEntities === false && variant === 'related-entity') return true;\n return false;\n}\n"]}
@@ -78,6 +78,30 @@ export interface FormContext {
78
78
  validationErrors?: ValidationErrorInfo[];
79
79
  /** Whether drag-and-drop section reordering is allowed. Read by panels to show/hide drag handles. */
80
80
  allowSectionReorder?: boolean;
81
+ /**
82
+ * Whether section headers may collapse/expand. When false, panels render
83
+ * always-expanded with no toggle chevron. Read by collapsible panels.
84
+ * Undefined / true means collapsible (the default).
85
+ */
86
+ collapsibleSections?: boolean;
87
+ /**
88
+ * Whether in-form record (FK) links are interactive. When false, FK values
89
+ * render as plain text instead of clickable links — used by dialog/slide-in
90
+ * surfaces so a modal context doesn't navigate the user away. Undefined /
91
+ * true means links are live (the default).
92
+ */
93
+ enableRecordLinks?: boolean;
94
+ /**
95
+ * Section-visibility rules, propagated from {@link EntityFormConfig}. Read by
96
+ * every collapsible panel — including slot-injected `BaseFormPanel`s — so
97
+ * per-instance show/hide applies uniformly across generated, custom, and
98
+ * injected sections. `showRelatedEntities === false` hides related-entity
99
+ * panels; `hiddenSectionKeys` / `visibleSectionKeys` (allow-list) target
100
+ * specific section keys.
101
+ */
102
+ showRelatedEntities?: boolean;
103
+ hiddenSectionKeys?: string[];
104
+ visibleSectionKeys?: string[];
81
105
  }
82
106
  /**
83
107
  * Result of a form save operation.
@@ -1 +1 @@
1
- {"version":3,"file":"form-types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/form-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/form-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-types.js","sourceRoot":"","sources":["../../../src/lib/types/form-types.ts"],"names":[],"mappings":"AAkKA;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC","sourcesContent":["import { ValidationErrorInfo } from '@memberjunction/global';\n\n/**\n * Width mode for the form panels container.\n * - 'centered': Max-width constrained and centered (default, good for readability)\n * - 'full-width': No max-width constraint, uses full available width\n */\nexport type FormWidthMode = 'centered' | 'full-width';\n\n/**\n * Variant for collapsible panel styling.\n * - 'default': Standard white card with accent border\n * - 'related-entity': Blue-accented card for related entity grid sections\n * - 'inherited': Purple-accented card for IS-A inherited field sections\n */\nexport type PanelVariant = 'default' | 'related-entity' | 'inherited';\n\n/**\n * Information about a section within the form.\n * Used to initialize and track section state.\n *\n * @template M Optional metadata type for custom per-section data\n */\nexport interface FormSectionInfo<M = unknown> {\n /** Unique key for this section (used in state persistence) */\n SectionKey: string;\n /** Display name shown in the panel header */\n SectionName: string;\n /** Whether the section starts expanded. Default: true for field sections, false for related entities */\n IsExpanded: boolean;\n /** Row count for related entity sections (shown as badge) */\n RowCount?: number;\n /** Custom metadata attached to this section */\n Metadata?: M;\n /** Panel variant for styling */\n Variant?: PanelVariant;\n /** Font Awesome icon class for the section header */\n Icon?: string;\n /**\n * If set, indicates this section contains fields inherited from a parent entity.\n * The value is the parent entity name (e.g., \"Products\" for a Meeting IS-A Product).\n */\n InheritedFromEntity?: string;\n}\n\n/**\n * Event emitted when a panel drag-to-reorder operation starts.\n */\nexport interface PanelDragStartEvent {\n SectionKey: string;\n Event: DragEvent;\n}\n\n/**\n * Event emitted when a panel is dropped onto another panel for reordering.\n */\nexport interface PanelDropEvent {\n SourceSectionKey: string;\n TargetSectionKey: string;\n}\n\n/**\n * Context object passed from the form to all child components (panels, fields).\n * Eliminates the need for many individual @Input properties.\n *\n * Property names use camelCase to maintain structural compatibility with\n * {@link BaseFormContext} from `@memberjunction/ng-base-forms`. This allows\n * BaseFormComponent.formContext to be passed directly to ng-forms components.\n */\nexport interface FormContext {\n /** Current search filter string for highlighting/filtering sections and fields */\n sectionFilter?: string;\n /** Whether to show fields that have empty values in read-only mode */\n showEmptyFields?: boolean;\n /**\n * When true, all fields show their validation errors regardless of touched state.\n * Set to true after a failed save attempt; reset on successful save or cancel.\n */\n showValidation?: boolean;\n /**\n * Validation errors from the most recent full-record Validate() call.\n * Fields filter by `ValidationErrorInfo.Source === FieldName` to find their errors.\n */\n validationErrors?: ValidationErrorInfo[];\n /** Whether drag-and-drop section reordering is allowed. Read by panels to show/hide drag handles. */\n allowSectionReorder?: boolean;\n}\n\n/**\n * Result of a form save operation.\n */\nexport interface FormSaveResult {\n /** Whether the save was successful */\n Success: boolean;\n /** Error message if save failed */\n ErrorMessage?: string;\n /** Number of milliseconds the save took */\n DurationMs?: number;\n}\n\n/**\n * Event emitted after a record is saved.\n */\nexport interface RecordSavedEvent {\n EntityName: string;\n RecordId: string;\n /** The display name of the saved record (for tab title updates, etc.) */\n RecordDisplayName?: string;\n Result: FormSaveResult;\n}\n\n/**\n * Event emitted after a record is deleted.\n */\nexport interface RecordDeletedEvent {\n EntityName: string;\n RecordId: string;\n}\n\n/**\n * Event emitted when a record save fails.\n */\nexport interface RecordSaveFailedEvent {\n EntityName: string;\n ErrorMessage: string;\n}\n\n/**\n * Event emitted when a record delete fails.\n */\nexport interface RecordDeleteFailedEvent {\n EntityName: string;\n ErrorMessage: string;\n}\n\n/**\n * Event emitted when validation fails before save.\n */\nexport interface ValidationFailedEvent {\n EntityName: string;\n Errors: string[];\n}\n\n/**\n * Notification event emitted by BaseFormComponent.\n * The host application subscribes and maps to its own notification system (toasts, snackbars, etc.).\n */\nexport interface FormNotificationEvent {\n /** The notification message text */\n Message: string;\n /** Notification severity */\n Type: 'success' | 'error' | 'warning' | 'info';\n /** Duration in milliseconds the notification should display */\n Duration: number;\n}\n\n/**\n * Backward-compatible alias for FormContext.\n * Explorer's BaseFormComponent used this name; new code should use FormContext.\n */\nexport type BaseFormContext = FormContext;\n\n/**\n * Creates a default FormContext with sensible defaults.\n */\nexport function createDefaultFormContext(): FormContext {\n return {\n sectionFilter: '',\n showEmptyFields: false,\n showValidation: false,\n validationErrors: []\n };\n}\n"]}
1
+ {"version":3,"file":"form-types.js","sourceRoot":"","sources":["../../../src/lib/types/form-types.ts"],"names":[],"mappings":"AA0LA;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC","sourcesContent":["import { ValidationErrorInfo } from '@memberjunction/global';\n\n/**\n * Width mode for the form panels container.\n * - 'centered': Max-width constrained and centered (default, good for readability)\n * - 'full-width': No max-width constraint, uses full available width\n */\nexport type FormWidthMode = 'centered' | 'full-width';\n\n/**\n * Variant for collapsible panel styling.\n * - 'default': Standard white card with accent border\n * - 'related-entity': Blue-accented card for related entity grid sections\n * - 'inherited': Purple-accented card for IS-A inherited field sections\n */\nexport type PanelVariant = 'default' | 'related-entity' | 'inherited';\n\n/**\n * Information about a section within the form.\n * Used to initialize and track section state.\n *\n * @template M Optional metadata type for custom per-section data\n */\nexport interface FormSectionInfo<M = unknown> {\n /** Unique key for this section (used in state persistence) */\n SectionKey: string;\n /** Display name shown in the panel header */\n SectionName: string;\n /** Whether the section starts expanded. Default: true for field sections, false for related entities */\n IsExpanded: boolean;\n /** Row count for related entity sections (shown as badge) */\n RowCount?: number;\n /** Custom metadata attached to this section */\n Metadata?: M;\n /** Panel variant for styling */\n Variant?: PanelVariant;\n /** Font Awesome icon class for the section header */\n Icon?: string;\n /**\n * If set, indicates this section contains fields inherited from a parent entity.\n * The value is the parent entity name (e.g., \"Products\" for a Meeting IS-A Product).\n */\n InheritedFromEntity?: string;\n}\n\n/**\n * Event emitted when a panel drag-to-reorder operation starts.\n */\nexport interface PanelDragStartEvent {\n SectionKey: string;\n Event: DragEvent;\n}\n\n/**\n * Event emitted when a panel is dropped onto another panel for reordering.\n */\nexport interface PanelDropEvent {\n SourceSectionKey: string;\n TargetSectionKey: string;\n}\n\n/**\n * Context object passed from the form to all child components (panels, fields).\n * Eliminates the need for many individual @Input properties.\n *\n * Property names use camelCase to maintain structural compatibility with\n * {@link BaseFormContext} from `@memberjunction/ng-base-forms`. This allows\n * BaseFormComponent.formContext to be passed directly to ng-forms components.\n */\nexport interface FormContext {\n /** Current search filter string for highlighting/filtering sections and fields */\n sectionFilter?: string;\n /** Whether to show fields that have empty values in read-only mode */\n showEmptyFields?: boolean;\n /**\n * When true, all fields show their validation errors regardless of touched state.\n * Set to true after a failed save attempt; reset on successful save or cancel.\n */\n showValidation?: boolean;\n /**\n * Validation errors from the most recent full-record Validate() call.\n * Fields filter by `ValidationErrorInfo.Source === FieldName` to find their errors.\n */\n validationErrors?: ValidationErrorInfo[];\n /** Whether drag-and-drop section reordering is allowed. Read by panels to show/hide drag handles. */\n allowSectionReorder?: boolean;\n /**\n * Whether section headers may collapse/expand. When false, panels render\n * always-expanded with no toggle chevron. Read by collapsible panels.\n * Undefined / true means collapsible (the default).\n */\n collapsibleSections?: boolean;\n /**\n * Whether in-form record (FK) links are interactive. When false, FK values\n * render as plain text instead of clickable links — used by dialog/slide-in\n * surfaces so a modal context doesn't navigate the user away. Undefined /\n * true means links are live (the default).\n */\n enableRecordLinks?: boolean;\n /**\n * Section-visibility rules, propagated from {@link EntityFormConfig}. Read by\n * every collapsible panel — including slot-injected `BaseFormPanel`s — so\n * per-instance show/hide applies uniformly across generated, custom, and\n * injected sections. `showRelatedEntities === false` hides related-entity\n * panels; `hiddenSectionKeys` / `visibleSectionKeys` (allow-list) target\n * specific section keys.\n */\n showRelatedEntities?: boolean;\n hiddenSectionKeys?: string[];\n visibleSectionKeys?: string[];\n}\n\n/**\n * Result of a form save operation.\n */\nexport interface FormSaveResult {\n /** Whether the save was successful */\n Success: boolean;\n /** Error message if save failed */\n ErrorMessage?: string;\n /** Number of milliseconds the save took */\n DurationMs?: number;\n}\n\n/**\n * Event emitted after a record is saved.\n */\nexport interface RecordSavedEvent {\n EntityName: string;\n RecordId: string;\n /** The display name of the saved record (for tab title updates, etc.) */\n RecordDisplayName?: string;\n Result: FormSaveResult;\n}\n\n/**\n * Event emitted after a record is deleted.\n */\nexport interface RecordDeletedEvent {\n EntityName: string;\n RecordId: string;\n}\n\n/**\n * Event emitted when a record save fails.\n */\nexport interface RecordSaveFailedEvent {\n EntityName: string;\n ErrorMessage: string;\n}\n\n/**\n * Event emitted when a record delete fails.\n */\nexport interface RecordDeleteFailedEvent {\n EntityName: string;\n ErrorMessage: string;\n}\n\n/**\n * Event emitted when validation fails before save.\n */\nexport interface ValidationFailedEvent {\n EntityName: string;\n Errors: string[];\n}\n\n/**\n * Notification event emitted by BaseFormComponent.\n * The host application subscribes and maps to its own notification system (toasts, snackbars, etc.).\n */\nexport interface FormNotificationEvent {\n /** The notification message text */\n Message: string;\n /** Notification severity */\n Type: 'success' | 'error' | 'warning' | 'info';\n /** Duration in milliseconds the notification should display */\n Duration: number;\n}\n\n/**\n * Backward-compatible alias for FormContext.\n * Explorer's BaseFormComponent used this name; new code should use FormContext.\n */\nexport type BaseFormContext = FormContext;\n\n/**\n * Creates a default FormContext with sensible defaults.\n */\nexport function createDefaultFormContext(): FormContext {\n return {\n sectionFilter: '',\n showEmptyFields: false,\n showValidation: false,\n validationErrors: []\n };\n}\n"]}