@memberjunction/ng-base-forms 6.1.0-edge.6 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/base-form-component.d.ts +23 -0
- package/dist/lib/base-form-component.d.ts.map +1 -1
- package/dist/lib/base-form-component.js +56 -13
- package/dist/lib/base-form-component.js.map +1 -1
- package/dist/lib/field/form-field.component.d.ts +69 -0
- package/dist/lib/field/form-field.component.d.ts.map +1 -1
- package/dist/lib/field/form-field.component.js +167 -18
- package/dist/lib/field/form-field.component.js.map +1 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.d.ts.map +1 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.js +7 -1
- package/dist/lib/isa-related-panel/isa-related-card.component.js.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.d.ts +10 -0
- package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.js +25 -0
- package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts +9 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.js +10 -2
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
- package/dist/lib/types/form-types.d.ts +8 -0
- package/dist/lib/types/form-types.d.ts.map +1 -1
- package/dist/lib/types/form-types.js.map +1 -1
- package/package.json +18 -18
|
@@ -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, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormToolbarItemConfig, FormToolbarItemKey, FormToolbarItemClickEventArgs, ResolvedToolbarItem } from '../types/form-toolbar-item';\nimport { IsAccordionFormChrome } from '../chrome/form-chrome';\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 { FormRecordRefreshCoordinator } from '../form-record-refresh.coordinator';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeRefreshEventArgs,\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 extends BaseAngularComponent implements DoCheck, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private recordRefresh = inject(FormRecordRefreshCoordinator, { optional: true });\n private destroy$ = new Subject<void>();\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 attachments linked to this record */\n @Input() AttachmentCount = 0;\n\n /** Whether the attachments feature is available for this record */\n @Input() AttachmentsAvailable = false;\n\n /** Whether the attachments panel is currently open */\n @Input() IsAttachmentsPanelOpen = 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 /** Whether a refresh from database operation is currently in progress */\n @Input() IsRefreshing = 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 /**\n * Form chrome layout. Expand/collapse-all only render for accordion.\n * Left-nav and right-nav show one section at a time.\n */\n @Input() ChromeLayout: 'accordion' | 'left-nav' | 'right-nav' = 'accordion';\n\n get ShowExpandCollapseAll(): boolean {\n return this.Config.ShowExpandCollapseAllButtons && IsAccordionFormChrome(this.ChromeLayout);\n }\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 /** Dynamic toolbar items registered by FormComponent or BaseFormPanels */\n @Input() RegisteredItems: FormToolbarItemConfig[] = [];\n\n /** Toolbar item property overrides */\n @Input() ItemOverrides: ReadonlyMap<string, Partial<FormToolbarItemConfig>> | null = null;\n\n /** Reference to the form component instance for event payloads */\n @Input() FormComponent: unknown = null;\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 when any toolbar item (standard or custom) is clicked */\n @Output() ToolbarItemClick = new EventEmitter<FormToolbarItemClickEventArgs>();\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 /** Emitted BEFORE refresh - can be cancelled by setting event.Cancel = true */\n @Output() BeforeRefresh = new EventEmitter<BeforeRefreshEventArgs>();\n\n /** Request to refresh the current record from the database */\n @Output() RefreshRequested = 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 /** Emitted when the Attachments button is clicked */\n @Output() AttachmentsPanelToggled = 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 ngOnInit(): void {\n this.recordRefresh?.Refreshed$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.InvalidateHierarchy();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\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 * Force a recompute of the IS-A descendant breadcrumb. Needed after\n * in-place record refresh because the Record object identity does not\n * change, so {@link CheckDescendantChains} would otherwise skip.\n */\n public InvalidateHierarchy(): void {\n this._lastRecordForChains = null;\n this.ComputeDescendantChains();\n this.cdr.markForCheck();\n }\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, this.ProviderToUse).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 OnRefresh(): void {\n if (this.IsRefreshing || this.IsSaving) return;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeRefreshEventArgs();\n this.BeforeRefresh.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('RefreshRecord')) return;\n this.RefreshRequested.emit();\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 OnAttachmentsPanel(): void {\n if (this.DispatchToFormRef('HandleAttachmentsPanel')) return;\n this.AttachmentsPanelToggled.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 /**\n * Resolves all standard and custom toolbar items into their active runtime state,\n * evaluated against the current Record and EditMode.\n */\n public get ResolvedToolbarItems(): ResolvedToolbarItem[] {\n const rawItems: FormToolbarItemConfig[] = [];\n\n // 1. Standard Built-in Items\n rawItems.push(\n {\n Key: 'edit',\n Text: '',\n Description: 'Edit this Record',\n Icon: 'fa-solid fa-pen-to-square',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 10,\n Visible: this.Config.ShowEditButton && this.UserCanEdit,\n Disabled: false,\n },\n {\n Key: 'delete',\n Text: '',\n Description: 'Delete this Record',\n Icon: 'fa-regular fa-trash-can',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 20,\n Visible: this.Config.ShowDeleteButton && this.UserCanDelete,\n Disabled: false,\n },\n {\n Key: 'refresh',\n Text: '',\n Description: 'Refresh record from database',\n Icon: 'fa-solid fa-arrows-rotate',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 25,\n Visible: this.Config.ShowRefreshButton !== false && (this.Record?.IsSaved ?? false),\n Disabled: this.IsSaving || this.IsRefreshing,\n IsLoading: this.IsRefreshing,\n },\n {\n Key: 'favorite',\n Text: '',\n Description: this.IsFavorite ? 'Remove Favorite' : 'Make Favorite',\n Icon: this.IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 30,\n Visible: this.Config.ShowFavoriteButton && this.FavoriteInitDone,\n Disabled: false,\n },\n {\n Key: 'history',\n Text: '',\n Description: this.VersionCount > 0 ? `${this.VersionCount} version(s) tracked` : 'Record Changes',\n Icon: 'fa-regular fa-clock',\n Badge: this.VersionCount > 0 ? `v${this.VersionCount}` : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 40,\n Visible: this.Config.ShowHistoryButton && this.TracksChanges,\n Disabled: false,\n },\n {\n Key: 'list',\n Text: '',\n Description: this.ListCount > 0 ? `Member of ${this.ListCount} list(s)` : 'Add to a list',\n Icon: 'fa-regular fa-bookmark',\n Badge: this.ListCount > 0 ? this.ListCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 50,\n Visible: this.Config.ShowListButton,\n Disabled: false,\n },\n {\n Key: 'tags',\n Text: '',\n Description: this.TagCount > 0 ? `${this.TagCount} tag(s)` : 'View tags',\n Icon: 'fa-solid fa-tags',\n Badge: this.TagCount > 0 ? this.TagCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 60,\n Visible: this.Config.ShowTagsButton,\n Disabled: false,\n },\n {\n Key: 'attachments',\n Text: '',\n Description: this.AttachmentCount > 0 ? `${this.AttachmentCount} attachment${this.AttachmentCount === 1 ? '' : 's'}` : 'Attachments',\n Icon: 'fa-solid fa-paperclip',\n Badge: this.AttachmentCount > 0 ? this.AttachmentCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 70,\n Visible: this.Config.ShowAttachmentsButton && this.AttachmentsAvailable,\n Disabled: false,\n CssClass: this.IsAttachmentsPanelOpen ? 'active' : '',\n }\n );\n\n // 2. Legacy Custom Buttons from Config.CustomButtons (if not already registered dynamically)\n if (this.Config.CustomButtons && this.Config.CustomButtons.length > 0) {\n for (const cb of this.Config.CustomButtons) {\n if (!this.RegisteredItems.some(r => r.Key === cb.Key)) {\n rawItems.push({\n Key: cb.Key,\n Text: cb.Name || '',\n Description: cb.Description || '',\n Icon: cb.Icon || '',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 100,\n Visible: cb.Visible !== false,\n Disabled: cb.Disabled || false,\n CssClass: cb.CssClass || '',\n });\n }\n }\n }\n\n // 3. Dynamically Registered Items (from BaseFormComponent / BaseFormPanel)\n if (this.RegisteredItems && this.RegisteredItems.length > 0) {\n for (const item of this.RegisteredItems) {\n const existingIdx = rawItems.findIndex(r => r.Key === item.Key);\n if (existingIdx >= 0) {\n rawItems[existingIdx] = { ...rawItems[existingIdx], ...item };\n } else {\n rawItems.push({ ...item });\n }\n }\n }\n\n // 4. Resolve states, evaluate predicates, apply overrides\n const resolved: ResolvedToolbarItem[] = [];\n const standardKeys: Set<string> = new Set(['edit', 'delete', 'refresh', 'favorite', 'history', 'list', 'tags', 'attachments']);\n\n for (const item of rawItems) {\n const overrides = this.ItemOverrides?.get(item.Key);\n const merged: FormToolbarItemConfig = overrides ? { ...item, ...overrides } : item;\n\n // Mode check\n const mode = merged.Mode ?? 'read';\n if (mode === 'read' && this.EditMode) continue;\n if (mode === 'edit' && !this.EditMode) continue;\n\n // Visibility evaluation\n let visible = true;\n if (typeof merged.Visible === 'function') {\n try {\n visible = merged.Visible(this.Record, this.EditMode);\n } catch {\n visible = false;\n }\n } else if (typeof merged.Visible === 'boolean') {\n visible = merged.Visible;\n }\n if (!visible) continue;\n\n // Disabled evaluation\n let disabled = false;\n let disabledReason: string | undefined;\n if (typeof merged.Disabled === 'function') {\n try {\n const res = merged.Disabled(this.Record, this.EditMode);\n if (typeof res === 'string') {\n disabled = true;\n disabledReason = res;\n } else {\n disabled = !!res;\n }\n } catch {\n disabled = true;\n }\n } else if (typeof merged.Disabled === 'string') {\n disabled = true;\n disabledReason = merged.Disabled;\n } else if (typeof merged.Disabled === 'boolean') {\n disabled = merged.Disabled;\n }\n\n // Loading evaluation\n let isLoading = false;\n if (typeof merged.IsLoading === 'function') {\n try {\n isLoading = merged.IsLoading(this.Record, this.EditMode);\n } catch {\n isLoading = false;\n }\n } else if (typeof merged.IsLoading === 'boolean') {\n isLoading = merged.IsLoading;\n }\n\n // Badge evaluation\n let badge: string | number | undefined;\n if (typeof merged.Badge === 'function') {\n try {\n const b = merged.Badge(this.Record);\n badge = b != null ? b : undefined;\n } catch {\n badge = undefined;\n }\n } else if (merged.Badge != null) {\n badge = merged.Badge;\n }\n\n const description = disabled && disabledReason ? disabledReason : (merged.Description ?? '');\n\n resolved.push({\n Key: merged.Key,\n Text: merged.Text ?? '',\n Description: description,\n Icon: merged.Icon ?? '',\n Variant: merged.Variant ?? 'default',\n Mode: mode,\n Placement: merged.Placement ?? 'actions',\n Order: merged.Order ?? 100,\n Visible: true,\n Disabled: disabled,\n DisabledReason: disabledReason,\n Badge: badge,\n IsLoading: isLoading,\n CssClass: merged.CssClass ?? '',\n IsStandard: standardKeys.has(merged.Key),\n Config: merged,\n });\n }\n\n return resolved.sort((a, b) => a.Order - b.Order);\n }\n\n public get ResolvedActionItems(): ResolvedToolbarItem[] {\n return this.ResolvedToolbarItems.filter(item => item.Placement === 'actions');\n }\n\n public get ResolvedEditBeforeSaveItems(): ResolvedToolbarItem[] {\n return this.ResolvedActionItems.filter(item => (item.Order ?? 100) < 50);\n }\n\n public get ResolvedEditAfterSaveItems(): ResolvedToolbarItem[] {\n return this.ResolvedActionItems.filter(item => (item.Order ?? 100) >= 50);\n }\n\n public get ResolvedRightItems(): ResolvedToolbarItem[] {\n return this.ResolvedToolbarItems.filter(item => item.Placement === 'right');\n }\n\n public async OnToolbarItemClick(item: ResolvedToolbarItem, event: MouseEvent): Promise<void> {\n if (item.Disabled || item.IsLoading) {\n return;\n }\n\n const clickArgs: FormToolbarItemClickEventArgs = {\n ItemKey: item.Key,\n Item: item.Config,\n Record: this.Record,\n EditMode: this.EditMode,\n FormComponent: this.FormComponent,\n Cancel: false\n };\n\n if (item.IsStandard) {\n switch (item.Key) {\n case 'edit':\n this.OnEdit();\n break;\n case 'delete':\n this.OnDeleteClick();\n break;\n case 'refresh':\n this.OnRefresh();\n break;\n case 'favorite':\n this.OnFavoriteToggle();\n break;\n case 'history':\n this.OnHistory();\n break;\n case 'list':\n this.OnListManagement();\n break;\n case 'tags':\n this.OnTagsPanel();\n break;\n case 'attachments':\n this.OnAttachmentsPanel();\n break;\n }\n }\n\n this.ToolbarItemClick.emit(clickArgs);\n this.CustomButtonClick.emit({\n ButtonKey: item.Key,\n Button: {\n Key: item.Key,\n Name: item.Text,\n Description: item.Description,\n Icon: item.Icon,\n Visible: item.Visible,\n Disabled: item.Disabled,\n CssClass: item.CssClass\n }\n });\n\n if (!clickArgs.Cancel && item.Config.OnClick) {\n try {\n await item.Config.OnClick(clickArgs);\n } catch (err) {\n console.error(`[FormToolbar] Error executing OnClick for toolbar item '${item.Key}':`, err);\n }\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 — {{ 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 @for (item of ResolvedEditBeforeSaveItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading || IsSaving\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span class=\"mj-list-count-badge\">{{ item.Badge }}</span>\n }\n </button>\n }\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 @for (item of ResolvedEditAfterSaveItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading || IsSaving\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span class=\"mj-list-count-badge\">{{ item.Badge }}</span>\n }\n </button>\n }\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 @for (item of ResolvedActionItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class.mj-forms-btn--history]=\"item.Key === 'history'\"\n [class.mj-forms-btn--list]=\"item.Key === 'list'\"\n [class.mj-forms-btn--tags]=\"item.Key === 'tags'\"\n [class.mj-forms-btn--attachments]=\"item.Key === 'attachments'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span [class]=\"item.Key === 'history' ? 'mj-version-count-badge' : 'mj-list-count-badge'\">{{ item.Badge }}</span>\n }\n </button>\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 (ShowExpandCollapseAll) {\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, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormToolbarItemConfig, FormToolbarItemKey, FormToolbarItemClickEventArgs, ResolvedToolbarItem } from '../types/form-toolbar-item';\nimport { IsAccordionFormChrome } from '../chrome/form-chrome';\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 { FormRecordRefreshCoordinator } from '../form-record-refresh.coordinator';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeRefreshEventArgs,\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 extends BaseAngularComponent implements DoCheck, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private recordRefresh = inject(FormRecordRefreshCoordinator, { optional: true });\n private destroy$ = new Subject<void>();\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 attachments linked to this record */\n @Input() AttachmentCount = 0;\n\n /** Whether the attachments feature is available for this record */\n @Input() AttachmentsAvailable = false;\n\n /** Whether the attachments panel is currently open */\n @Input() IsAttachmentsPanelOpen = 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 /** Whether a refresh from database operation is currently in progress */\n @Input() IsRefreshing = 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 /**\n * Form chrome layout. Expand/collapse-all only render for accordion.\n * Left-nav and right-nav show one section at a time.\n */\n @Input() ChromeLayout: 'accordion' | 'left-nav' | 'right-nav' = 'accordion';\n\n get ShowExpandCollapseAll(): boolean {\n return this.Config.ShowExpandCollapseAllButtons && IsAccordionFormChrome(this.ChromeLayout);\n }\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 /** Dynamic toolbar items registered by FormComponent or BaseFormPanels */\n @Input() RegisteredItems: FormToolbarItemConfig[] = [];\n\n /** Toolbar item property overrides */\n @Input() ItemOverrides: ReadonlyMap<string, Partial<FormToolbarItemConfig>> | null = null;\n\n /** Reference to the form component instance for event payloads */\n @Input() FormComponent: unknown = null;\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 when any toolbar item (standard or custom) is clicked */\n @Output() ToolbarItemClick = new EventEmitter<FormToolbarItemClickEventArgs>();\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 /** Emitted BEFORE refresh - can be cancelled by setting event.Cancel = true */\n @Output() BeforeRefresh = new EventEmitter<BeforeRefreshEventArgs>();\n\n /** Request to refresh the current record from the database */\n @Output() RefreshRequested = 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 /** Emitted when the Attachments button is clicked */\n @Output() AttachmentsPanelToggled = 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 ngOnInit(): void {\n this.recordRefresh?.Refreshed$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.InvalidateHierarchy();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\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 /**\n * Display name for the edit banner.\n *\n * The Name field is readable by the current user in almost every case, but it is an ordinary\n * field and field-level security can deny it. `BaseEntity.Get()` THROWS on a denied field, and\n * this getter runs on every change-detection cycle for the toolbar that sits on top of every\n * form — so an unguarded read here does not hide a title, it takes the whole form down. Fall\n * back to the primary key, which is unrestrictable by construction.\n */\n get RecordDisplayName(): string {\n if (!this.Record) return '';\n const info = this.Record.EntityInfo;\n if (info?.NameField && info.IsFieldReadableByUser(info.NameField.Name, this.ProviderToUse?.CurrentUser)) {\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 * Force a recompute of the IS-A descendant breadcrumb. Needed after\n * in-place record refresh because the Record object identity does not\n * change, so {@link CheckDescendantChains} would otherwise skip.\n */\n public InvalidateHierarchy(): void {\n this._lastRecordForChains = null;\n this.ComputeDescendantChains();\n this.cdr.markForCheck();\n }\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, this.ProviderToUse).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 OnRefresh(): void {\n if (this.IsRefreshing || this.IsSaving) return;\n\n // Emit Before event - handler can cancel by setting event.Cancel = true\n const beforeEvent = new BeforeRefreshEventArgs();\n this.BeforeRefresh.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n if (this.DispatchToFormRef('RefreshRecord')) return;\n this.RefreshRequested.emit();\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 OnAttachmentsPanel(): void {\n if (this.DispatchToFormRef('HandleAttachmentsPanel')) return;\n this.AttachmentsPanelToggled.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 /**\n * Resolves all standard and custom toolbar items into their active runtime state,\n * evaluated against the current Record and EditMode.\n */\n public get ResolvedToolbarItems(): ResolvedToolbarItem[] {\n const rawItems: FormToolbarItemConfig[] = [];\n\n // 1. Standard Built-in Items\n rawItems.push(\n {\n Key: 'edit',\n Text: '',\n Description: 'Edit this Record',\n Icon: 'fa-solid fa-pen-to-square',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 10,\n Visible: this.Config.ShowEditButton && this.UserCanEdit,\n Disabled: false,\n },\n {\n Key: 'delete',\n Text: '',\n Description: 'Delete this Record',\n Icon: 'fa-regular fa-trash-can',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 20,\n Visible: this.Config.ShowDeleteButton && this.UserCanDelete,\n Disabled: false,\n },\n {\n Key: 'refresh',\n Text: '',\n Description: 'Refresh record from database',\n Icon: 'fa-solid fa-arrows-rotate',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 25,\n Visible: this.Config.ShowRefreshButton !== false && (this.Record?.IsSaved ?? false),\n Disabled: this.IsSaving || this.IsRefreshing,\n IsLoading: this.IsRefreshing,\n },\n {\n Key: 'favorite',\n Text: '',\n Description: this.IsFavorite ? 'Remove Favorite' : 'Make Favorite',\n Icon: this.IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 30,\n Visible: this.Config.ShowFavoriteButton && this.FavoriteInitDone,\n Disabled: false,\n },\n {\n Key: 'history',\n Text: '',\n Description: this.VersionCount > 0 ? `${this.VersionCount} version(s) tracked` : 'Record Changes',\n Icon: 'fa-regular fa-clock',\n Badge: this.VersionCount > 0 ? `v${this.VersionCount}` : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 40,\n Visible: this.Config.ShowHistoryButton && this.TracksChanges,\n Disabled: false,\n },\n {\n Key: 'list',\n Text: '',\n Description: this.ListCount > 0 ? `Member of ${this.ListCount} list(s)` : 'Add to a list',\n Icon: 'fa-regular fa-bookmark',\n Badge: this.ListCount > 0 ? this.ListCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 50,\n Visible: this.Config.ShowListButton,\n Disabled: false,\n },\n {\n Key: 'tags',\n Text: '',\n Description: this.TagCount > 0 ? `${this.TagCount} tag(s)` : 'View tags',\n Icon: 'fa-solid fa-tags',\n Badge: this.TagCount > 0 ? this.TagCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 60,\n Visible: this.Config.ShowTagsButton,\n Disabled: false,\n },\n {\n Key: 'attachments',\n Text: '',\n Description: this.AttachmentCount > 0 ? `${this.AttachmentCount} attachment${this.AttachmentCount === 1 ? '' : 's'}` : 'Attachments',\n Icon: 'fa-solid fa-paperclip',\n Badge: this.AttachmentCount > 0 ? this.AttachmentCount : undefined,\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 70,\n Visible: this.Config.ShowAttachmentsButton && this.AttachmentsAvailable,\n Disabled: false,\n CssClass: this.IsAttachmentsPanelOpen ? 'active' : '',\n }\n );\n\n // 2. Legacy Custom Buttons from Config.CustomButtons (if not already registered dynamically)\n if (this.Config.CustomButtons && this.Config.CustomButtons.length > 0) {\n for (const cb of this.Config.CustomButtons) {\n if (!this.RegisteredItems.some(r => r.Key === cb.Key)) {\n rawItems.push({\n Key: cb.Key,\n Text: cb.Name || '',\n Description: cb.Description || '',\n Icon: cb.Icon || '',\n Variant: 'default',\n Mode: 'read',\n Placement: 'actions',\n Order: 100,\n Visible: cb.Visible !== false,\n Disabled: cb.Disabled || false,\n CssClass: cb.CssClass || '',\n });\n }\n }\n }\n\n // 3. Dynamically Registered Items (from BaseFormComponent / BaseFormPanel)\n if (this.RegisteredItems && this.RegisteredItems.length > 0) {\n for (const item of this.RegisteredItems) {\n const existingIdx = rawItems.findIndex(r => r.Key === item.Key);\n if (existingIdx >= 0) {\n rawItems[existingIdx] = { ...rawItems[existingIdx], ...item };\n } else {\n rawItems.push({ ...item });\n }\n }\n }\n\n // 4. Resolve states, evaluate predicates, apply overrides\n const resolved: ResolvedToolbarItem[] = [];\n const standardKeys: Set<string> = new Set(['edit', 'delete', 'refresh', 'favorite', 'history', 'list', 'tags', 'attachments']);\n\n for (const item of rawItems) {\n const overrides = this.ItemOverrides?.get(item.Key);\n const merged: FormToolbarItemConfig = overrides ? { ...item, ...overrides } : item;\n\n // Mode check\n const mode = merged.Mode ?? 'read';\n if (mode === 'read' && this.EditMode) continue;\n if (mode === 'edit' && !this.EditMode) continue;\n\n // Visibility evaluation\n let visible = true;\n if (typeof merged.Visible === 'function') {\n try {\n visible = merged.Visible(this.Record, this.EditMode);\n } catch {\n visible = false;\n }\n } else if (typeof merged.Visible === 'boolean') {\n visible = merged.Visible;\n }\n if (!visible) continue;\n\n // Disabled evaluation\n let disabled = false;\n let disabledReason: string | undefined;\n if (typeof merged.Disabled === 'function') {\n try {\n const res = merged.Disabled(this.Record, this.EditMode);\n if (typeof res === 'string') {\n disabled = true;\n disabledReason = res;\n } else {\n disabled = !!res;\n }\n } catch {\n disabled = true;\n }\n } else if (typeof merged.Disabled === 'string') {\n disabled = true;\n disabledReason = merged.Disabled;\n } else if (typeof merged.Disabled === 'boolean') {\n disabled = merged.Disabled;\n }\n\n // Loading evaluation\n let isLoading = false;\n if (typeof merged.IsLoading === 'function') {\n try {\n isLoading = merged.IsLoading(this.Record, this.EditMode);\n } catch {\n isLoading = false;\n }\n } else if (typeof merged.IsLoading === 'boolean') {\n isLoading = merged.IsLoading;\n }\n\n // Badge evaluation\n let badge: string | number | undefined;\n if (typeof merged.Badge === 'function') {\n try {\n const b = merged.Badge(this.Record);\n badge = b != null ? b : undefined;\n } catch {\n badge = undefined;\n }\n } else if (merged.Badge != null) {\n badge = merged.Badge;\n }\n\n const description = disabled && disabledReason ? disabledReason : (merged.Description ?? '');\n\n resolved.push({\n Key: merged.Key,\n Text: merged.Text ?? '',\n Description: description,\n Icon: merged.Icon ?? '',\n Variant: merged.Variant ?? 'default',\n Mode: mode,\n Placement: merged.Placement ?? 'actions',\n Order: merged.Order ?? 100,\n Visible: true,\n Disabled: disabled,\n DisabledReason: disabledReason,\n Badge: badge,\n IsLoading: isLoading,\n CssClass: merged.CssClass ?? '',\n IsStandard: standardKeys.has(merged.Key),\n Config: merged,\n });\n }\n\n return resolved.sort((a, b) => a.Order - b.Order);\n }\n\n public get ResolvedActionItems(): ResolvedToolbarItem[] {\n return this.ResolvedToolbarItems.filter(item => item.Placement === 'actions');\n }\n\n public get ResolvedEditBeforeSaveItems(): ResolvedToolbarItem[] {\n return this.ResolvedActionItems.filter(item => (item.Order ?? 100) < 50);\n }\n\n public get ResolvedEditAfterSaveItems(): ResolvedToolbarItem[] {\n return this.ResolvedActionItems.filter(item => (item.Order ?? 100) >= 50);\n }\n\n public get ResolvedRightItems(): ResolvedToolbarItem[] {\n return this.ResolvedToolbarItems.filter(item => item.Placement === 'right');\n }\n\n public async OnToolbarItemClick(item: ResolvedToolbarItem, event: MouseEvent): Promise<void> {\n if (item.Disabled || item.IsLoading) {\n return;\n }\n\n const clickArgs: FormToolbarItemClickEventArgs = {\n ItemKey: item.Key,\n Item: item.Config,\n Record: this.Record,\n EditMode: this.EditMode,\n FormComponent: this.FormComponent,\n Cancel: false\n };\n\n if (item.IsStandard) {\n switch (item.Key) {\n case 'edit':\n this.OnEdit();\n break;\n case 'delete':\n this.OnDeleteClick();\n break;\n case 'refresh':\n this.OnRefresh();\n break;\n case 'favorite':\n this.OnFavoriteToggle();\n break;\n case 'history':\n this.OnHistory();\n break;\n case 'list':\n this.OnListManagement();\n break;\n case 'tags':\n this.OnTagsPanel();\n break;\n case 'attachments':\n this.OnAttachmentsPanel();\n break;\n }\n }\n\n this.ToolbarItemClick.emit(clickArgs);\n this.CustomButtonClick.emit({\n ButtonKey: item.Key,\n Button: {\n Key: item.Key,\n Name: item.Text,\n Description: item.Description,\n Icon: item.Icon,\n Visible: item.Visible,\n Disabled: item.Disabled,\n CssClass: item.CssClass\n }\n });\n\n if (!clickArgs.Cancel && item.Config.OnClick) {\n try {\n await item.Config.OnClick(clickArgs);\n } catch (err) {\n console.error(`[FormToolbar] Error executing OnClick for toolbar item '${item.Key}':`, err);\n }\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 — {{ 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 @for (item of ResolvedEditBeforeSaveItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading || IsSaving\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span class=\"mj-list-count-badge\">{{ item.Badge }}</span>\n }\n </button>\n }\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 @for (item of ResolvedEditAfterSaveItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading || IsSaving\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span class=\"mj-list-count-badge\">{{ item.Badge }}</span>\n }\n </button>\n }\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 @for (item of ResolvedActionItems; track item.Key) {\n <button class=\"mj-forms-btn\"\n [class.mj-forms-btn--primary]=\"item.Variant === 'primary'\"\n [class.mj-forms-btn--secondary]=\"item.Variant === 'secondary'\"\n [class.mj-forms-btn--accent]=\"item.Variant === 'accent'\"\n [class.mj-forms-btn--danger]=\"item.Variant === 'danger'\"\n [class.mj-forms-btn--ghost]=\"item.Variant === 'ghost'\"\n [class.mj-forms-btn--history]=\"item.Key === 'history'\"\n [class.mj-forms-btn--list]=\"item.Key === 'list'\"\n [class.mj-forms-btn--tags]=\"item.Key === 'tags'\"\n [class.mj-forms-btn--attachments]=\"item.Key === 'attachments'\"\n [class]=\"item.CssClass\"\n [disabled]=\"item.Disabled || item.IsLoading\"\n [title]=\"item.Description\"\n (click)=\"OnToolbarItemClick(item, $event)\">\n @if (item.IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n @if (item.Text) {\n <span class=\"mj-forms-btn-text\">{{ item.Text }}</span>\n }\n @if (item.Badge != null) {\n <span [class]=\"item.Key === 'history' ? 'mj-version-count-badge' : 'mj-list-count-badge'\">{{ item.Badge }}</span>\n }\n </button>\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 (ShowExpandCollapseAll) {\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"]}
|
|
@@ -77,6 +77,14 @@ export interface FormContext {
|
|
|
77
77
|
* Fields filter by `ValidationErrorInfo.Source === FieldName` to find their errors.
|
|
78
78
|
*/
|
|
79
79
|
validationErrors?: ValidationErrorInfo[];
|
|
80
|
+
/**
|
|
81
|
+
* Increments every time the form publishes a fresh set of `validationErrors` (each failed save).
|
|
82
|
+
* A field compares it with the revision current when the user last edited it: an edit made AFTER
|
|
83
|
+
* the failure means the user is addressing the error, so the field goes back to its own live
|
|
84
|
+
* validation; an edit made BEFORE it must not hide an error the save just reported — which is what
|
|
85
|
+
* happened to a server-side `ValidateAsync()` refusal on the very field the user had just typed in.
|
|
86
|
+
*/
|
|
87
|
+
validationRevision?: number;
|
|
80
88
|
/** Whether drag-and-drop section reordering is allowed. Read by panels to show/hide drag handles. */
|
|
81
89
|
allowSectionReorder?: boolean;
|
|
82
90
|
/**
|
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"form-types.js","sourceRoot":"","sources":["../../../src/lib/types/form-types.ts"],"names":[],"mappings":"AA2MA;;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 type { BaseEntity } from '@memberjunction/core';\nimport { 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 /**\n * Increments every time the form publishes a fresh set of `validationErrors` (each failed save).\n * A field compares it with the revision current when the user last edited it: an edit made AFTER\n * the failure means the user is addressing the error, so the field goes back to its own live\n * validation; an edit made BEFORE it must not hide an error the save just reported — which is what\n * happened to a server-side `ValidateAsync()` refusal on the very field the user had just typed in.\n */\n validationRevision?: number;\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 saved record is reloaded from the database in place.\n */\nexport interface RecordRefreshedEvent {\n EntityName: string;\n Record: BaseEntity;\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-base-forms",
|
|
3
|
-
"version": "6.1.0
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"description": "MemberJunction: Generic Angular form components for rendering and editing entity records. Provides configurable toolbar, modern form fields (native HTML, no PrimeNG dependency), collapsible panels with IS-A inheritance support, and event-driven navigation. Zero Explorer dependencies - usable in any Angular application.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@angular/compiler": "21.2.22",
|
|
22
22
|
"@angular/compiler-cli": "21.2.22",
|
|
23
|
-
"@memberjunction/ng-test-utils": "6.1.0
|
|
23
|
+
"@memberjunction/ng-test-utils": "6.1.0",
|
|
24
24
|
"vitest": "^4.0.18"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
"@angular/forms": "^21.2.22"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@memberjunction/core": "6.1.0
|
|
34
|
-
"@memberjunction/core-entities": "6.1.0
|
|
35
|
-
"@memberjunction/global": "6.1.0
|
|
36
|
-
"@memberjunction/interactive-component-types": "6.1.0
|
|
37
|
-
"@memberjunction/ng-base-types": "6.1.0
|
|
38
|
-
"@memberjunction/ng-code-editor": "6.1.0
|
|
39
|
-
"@memberjunction/ng-entity-viewer": "6.1.0
|
|
40
|
-
"@memberjunction/ng-file-storage": "6.1.0
|
|
41
|
-
"@memberjunction/ng-list-management": "6.1.0
|
|
42
|
-
"@memberjunction/ng-markdown": "6.1.0
|
|
43
|
-
"@memberjunction/ng-notifications": "6.1.0
|
|
44
|
-
"@memberjunction/ng-react": "6.1.0
|
|
45
|
-
"@memberjunction/ng-record-changes": "6.1.0
|
|
46
|
-
"@memberjunction/ng-record-tags": "6.1.0
|
|
47
|
-
"@memberjunction/ng-shared-generic": "6.1.0
|
|
48
|
-
"@memberjunction/ng-ui-components": "6.1.0
|
|
33
|
+
"@memberjunction/core": "6.1.0",
|
|
34
|
+
"@memberjunction/core-entities": "6.1.0",
|
|
35
|
+
"@memberjunction/global": "6.1.0",
|
|
36
|
+
"@memberjunction/interactive-component-types": "6.1.0",
|
|
37
|
+
"@memberjunction/ng-base-types": "6.1.0",
|
|
38
|
+
"@memberjunction/ng-code-editor": "6.1.0",
|
|
39
|
+
"@memberjunction/ng-entity-viewer": "6.1.0",
|
|
40
|
+
"@memberjunction/ng-file-storage": "6.1.0",
|
|
41
|
+
"@memberjunction/ng-list-management": "6.1.0",
|
|
42
|
+
"@memberjunction/ng-markdown": "6.1.0",
|
|
43
|
+
"@memberjunction/ng-notifications": "6.1.0",
|
|
44
|
+
"@memberjunction/ng-react": "6.1.0",
|
|
45
|
+
"@memberjunction/ng-record-changes": "6.1.0",
|
|
46
|
+
"@memberjunction/ng-record-tags": "6.1.0",
|
|
47
|
+
"@memberjunction/ng-shared-generic": "6.1.0",
|
|
48
|
+
"@memberjunction/ng-ui-components": "6.1.0",
|
|
49
49
|
"rxjs": "^7.8.2",
|
|
50
50
|
"tslib": "^2.8.1"
|
|
51
51
|
},
|