@memberjunction/ng-base-forms 5.38.0 → 5.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +53 -0
  2. package/dist/lib/base-form-component.d.ts +18 -0
  3. package/dist/lib/base-form-component.d.ts.map +1 -1
  4. package/dist/lib/base-form-component.js +31 -2
  5. package/dist/lib/base-form-component.js.map +1 -1
  6. package/dist/lib/container/record-form-container.component.d.ts +14 -0
  7. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  8. package/dist/lib/container/record-form-container.component.js +59 -33
  9. package/dist/lib/container/record-form-container.component.js.map +1 -1
  10. package/dist/lib/field/fk-search-utils.d.ts +31 -0
  11. package/dist/lib/field/fk-search-utils.d.ts.map +1 -0
  12. package/dist/lib/field/fk-search-utils.js +47 -0
  13. package/dist/lib/field/fk-search-utils.js.map +1 -0
  14. package/dist/lib/field/form-field.component.d.ts +401 -6
  15. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  16. package/dist/lib/field/form-field.component.js +1646 -214
  17. package/dist/lib/field/form-field.component.js.map +1 -1
  18. package/dist/lib/field/linked-field-options.d.ts +76 -0
  19. package/dist/lib/field/linked-field-options.d.ts.map +1 -0
  20. package/dist/lib/field/linked-field-options.js +80 -0
  21. package/dist/lib/field/linked-field-options.js.map +1 -0
  22. package/dist/lib/host/entity-form-host.component.d.ts +159 -0
  23. package/dist/lib/host/entity-form-host.component.d.ts.map +1 -0
  24. package/dist/lib/host/entity-form-host.component.js +539 -0
  25. package/dist/lib/host/entity-form-host.component.js.map +1 -0
  26. package/dist/lib/isa-related-panel/isa-related-card.component.js +2 -2
  27. package/dist/lib/overlays/base-form-overlay.d.ts +114 -0
  28. package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -0
  29. package/dist/lib/overlays/base-form-overlay.js +227 -0
  30. package/dist/lib/overlays/base-form-overlay.js.map +1 -0
  31. package/dist/lib/overlays/form-dialog.component.d.ts +35 -0
  32. package/dist/lib/overlays/form-dialog.component.d.ts.map +1 -0
  33. package/dist/lib/overlays/form-dialog.component.js +92 -0
  34. package/dist/lib/overlays/form-dialog.component.js.map +1 -0
  35. package/dist/lib/overlays/form-presenter.service.d.ts +37 -0
  36. package/dist/lib/overlays/form-presenter.service.d.ts.map +1 -0
  37. package/dist/lib/overlays/form-presenter.service.js +130 -0
  38. package/dist/lib/overlays/form-presenter.service.js.map +1 -0
  39. package/dist/lib/overlays/form-presenter.types.d.ts +65 -0
  40. package/dist/lib/overlays/form-presenter.types.d.ts.map +1 -0
  41. package/dist/lib/overlays/form-presenter.types.js +25 -0
  42. package/dist/lib/overlays/form-presenter.types.js.map +1 -0
  43. package/dist/lib/overlays/form-slide-in.component.d.ts +38 -0
  44. package/dist/lib/overlays/form-slide-in.component.d.ts.map +1 -0
  45. package/dist/lib/overlays/form-slide-in.component.js +106 -0
  46. package/dist/lib/overlays/form-slide-in.component.js.map +1 -0
  47. package/dist/lib/overlays/form-window.component.d.ts +32 -0
  48. package/dist/lib/overlays/form-window.component.d.ts.map +1 -0
  49. package/dist/lib/overlays/form-window.component.js +93 -0
  50. package/dist/lib/overlays/form-window.component.js.map +1 -0
  51. package/dist/lib/panel/collapsible-panel.component.d.ts +19 -2
  52. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  53. package/dist/lib/panel/collapsible-panel.component.js +70 -13
  54. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  55. package/dist/lib/resolver/form-resolver.service.d.ts +139 -0
  56. package/dist/lib/resolver/form-resolver.service.d.ts.map +1 -0
  57. package/dist/lib/resolver/form-resolver.service.js +235 -0
  58. package/dist/lib/resolver/form-resolver.service.js.map +1 -0
  59. package/dist/lib/section-manager/section-manager.component.js +2 -2
  60. package/dist/lib/toolbar/form-toolbar.component.js +2 -2
  61. package/dist/lib/types/entity-form-config.d.ts +125 -0
  62. package/dist/lib/types/entity-form-config.d.ts.map +1 -0
  63. package/dist/lib/types/entity-form-config.js +75 -0
  64. package/dist/lib/types/entity-form-config.js.map +1 -0
  65. package/dist/lib/types/form-types.d.ts +24 -0
  66. package/dist/lib/types/form-types.d.ts.map +1 -1
  67. package/dist/lib/types/form-types.js.map +1 -1
  68. package/dist/lib/types/navigation-events.d.ts +46 -2
  69. package/dist/lib/types/navigation-events.d.ts.map +1 -1
  70. package/dist/lib/types/navigation-events.js.map +1 -1
  71. package/dist/module.d.ts +12 -8
  72. package/dist/module.d.ts.map +1 -1
  73. package/dist/module.js +26 -7
  74. package/dist/module.js.map +1 -1
  75. package/dist/public-api.d.ts +11 -0
  76. package/dist/public-api.d.ts.map +1 -1
  77. package/dist/public-api.js +14 -0
  78. package/dist/public-api.js.map +1 -1
  79. package/package.json +17 -13
@@ -1 +1 @@
1
- {"version":3,"file":"form-field.component.js","sourceRoot":"","sources":["../../../src/lib/field/form-field.component.ts","../../../src/lib/field/form-field.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityFieldInfo, CompositeKey, KeyValuePair, RunView } from '@memberjunction/core';\nimport { ValidationErrorInfo, HighlightSearchMatches } from '@memberjunction/global';\nimport { FormContext } from '../types/form-types';\nimport { FormNavigationEvent } from '../types/navigation-events';\n\n/**\n * Represents a suggestion item for FK autocomplete search results.\n */\nexport interface FKSuggestion {\n PrimaryKeyValue: unknown;\n DisplayName: string;\n}\n\n/**\n * Modern form field component that renders entity fields in both read-only and edit modes.\n *\n * **Read mode**: Clean text display with optional hyperlinks (email, URL, record).\n * **Edit mode**: Native HTML inputs with custom-built select and autocomplete components.\n *\n * Uses:\n * - Native `<input>` for text, number, date\n * - Custom styled dropdown for value list selections\n * - Custom autocomplete with floating dropdown for foreign key search\n * - Custom-styled `<input type=\"checkbox\">` for booleans\n *\n * All navigation (clicking FK links, email links, URL links) is emitted as events.\n *\n * @example\n * ```html\n * <mj-form-field\n * [Record]=\"record\"\n * [EditMode]=\"editMode\"\n * FieldName=\"CustomerName\"\n * Type=\"textbox\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\"\n * (ValueChange)=\"onValueChange($event)\">\n * </mj-form-field>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.css']\n})\nexport class MjFormFieldComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** The entity record containing this field */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** The field code name (must match a field on the entity) */\n @Input() FieldName = '';\n\n /**\n * The control type to render in edit mode.\n * Determines which input component is used.\n *\n * Also accepts deprecated Kendo-style type names for backward compatibility:\n * - `'dropdownlist'` → `'select'`\n * - `'numerictextbox'` → `'number'`\n */\n @Input()\n set Type(value: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' | 'dropdownlist' | 'numerictextbox') {\n // Normalize deprecated Kendo type names to modern equivalents\n switch (value) {\n case 'dropdownlist': this._type = 'select'; break;\n case 'numerictextbox': this._type = 'number'; break;\n default: this._type = value; break;\n }\n }\n get Type(): 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' {\n return this._type;\n }\n private _type: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' = 'textbox';\n\n /**\n * Link type for read-only rendering.\n * - 'Email': renders as mailto link\n * - 'URL': renders as external hyperlink\n * - 'Record': renders as FK link to related entity record\n * - 'None': renders as plain text\n */\n @Input() LinkType: 'Email' | 'URL' | 'Record' | 'None' = 'None';\n\n /** Whether to show the field label */\n @Input() ShowLabel = true;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [Record] instead */\n @Input('record') set _deprecatedRecord(value: BaseEntity) { this.Record = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n /** Whether to hide this field when empty in read-only mode. Default: true */\n @Input() HideWhenEmptyInReadOnlyMode = true;\n\n /** Override display name (defaults to entity field metadata DisplayName) */\n @Input() DisplayNameOverride = '';\n\n /** Override possible values for select/autocomplete */\n @Input() PossibleValuesOverride: string[] | null = null;\n\n /** Emitted when the field value changes */\n @Output() ValueChange = new EventEmitter<{ FieldName: string; OldValue: unknown; NewValue: unknown }>();\n\n /** Emitted when a navigation action is triggered (FK link click, email click, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Computed Properties ----\n\n /** Get EntityFieldInfo metadata for this field */\n get FieldInfo(): EntityFieldInfo | undefined {\n return this.Record?.EntityInfo?.Fields?.find(f => f.Name === this.FieldName);\n }\n\n /** Display name from metadata or override */\n get DisplayName(): string {\n if (this.DisplayNameOverride) return this.DisplayNameOverride;\n\n // Friendly labels for standard MJ timestamp fields\n if (this.FieldName === '__mj_CreatedAt') return 'Created';\n if (this.FieldName === '__mj_UpdatedAt') return 'Updated';\n\n // For FK fields that have a mapped name field, use the name field's\n // friendly label (e.g., show \"Parent\" instead of \"Parent ID\")\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const nameField = this.Record?.EntityInfo?.Fields?.find(f => f.Name === nameFieldMap);\n if (nameField) {\n return nameField.DisplayNameOrName;\n }\n }\n\n return this.FieldInfo?.DisplayNameOrName ?? this.FieldName;\n }\n\n /** Display name with search highlighting applied. Output is bound to `[innerHTML]`. */\n get HighlightedDisplayName(): string {\n return HighlightSearchMatches(this.DisplayName, this.FormContext?.sectionFilter ?? '', 'mj-forms-search-highlight');\n }\n\n /** Current field value */\n get Value(): unknown {\n return this.Record?.Get(this.FieldName);\n }\n\n /** Set field value, mark touched, run validation, and emit change event */\n set Value(newValue: unknown) {\n if (!this.Record) return;\n const oldValue = this.Record.Get(this.FieldName);\n this.Record.Set(this.FieldName, newValue);\n this._touched = true;\n this.runFieldValidation();\n this.ValueChange.emit({ FieldName: this.FieldName, OldValue: oldValue, NewValue: newValue });\n }\n\n /** Whether this field is read-only based on entity metadata */\n get IsFieldReadOnly(): boolean {\n if (!this.FieldInfo) return false;\n return this.FieldInfo.ReadOnly;\n }\n\n /** Whether this field has been modified (dirty). Only shown for saved records (not new). */\n get IsDirty(): boolean {\n if (!this.Record || !this.Record.IsSaved) return false;\n const field = this.Record.Fields?.find(f => f.Name === this.FieldName);\n return field?.Dirty ?? false;\n }\n\n /** Whether this field is required (not nullable) */\n get IsRequired(): boolean {\n return this.FieldInfo?.AllowsNull === false;\n }\n\n /** Whether this is a required field that is currently empty (for validation styling) */\n get IsRequiredEmpty(): boolean {\n // Defer to the validation system when it has active errors for this field\n if (this.ShowErrors) return false;\n if (!this.IsRequired || !this.EditMode) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n // ---- INLINE VALIDATION ----\n\n /** Whether the user has interacted with (changed) this field */\n private _touched = false;\n\n /** Locally computed validation errors for this field */\n private _fieldErrors: ValidationErrorInfo[] = [];\n\n /** Validation errors for this field from the best available source */\n get FieldErrors(): ValidationErrorInfo[] {\n // If touched, use fresh local validation (covers real-time feedback)\n if (this._touched) {\n return this._fieldErrors;\n }\n // Otherwise use form-level errors from save failure (covers untouched fields)\n const contextErrors = this.FormContext?.validationErrors;\n if (contextErrors && contextErrors.length > 0) {\n return contextErrors.filter(e => e.Source === this.FieldName);\n }\n return [];\n }\n\n /** Whether to show validation messages (touched OR form-level showValidation) */\n get ShowValidation(): boolean {\n if (!this.EditMode || this.IsFieldReadOnly) return false;\n return this._touched || (this.FormContext?.showValidation === true);\n }\n\n /** Whether this field has active error-level validation failures to display */\n get ShowErrors(): boolean {\n return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');\n }\n\n /** Whether this field has active warning-level validation issues to display */\n get ShowWarnings(): boolean {\n return this.ShowValidation && !this.ShowErrors && this.FieldErrors.some(e => e.Type === 'Warning');\n }\n\n /** Error messages to render in the template */\n get DisplayErrors(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Failure');\n }\n\n /** Warning messages to render in the template */\n get DisplayWarnings(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Warning');\n }\n\n /**\n * Runs validation for this field using the full Record.Validate() method.\n * This captures both built-in field checks and custom Validate() overrides\n * (including cross-field rules). Results are filtered to this field only.\n */\n private runFieldValidation(): void {\n if (!this.Record || !this.EditMode) {\n this._fieldErrors = [];\n return;\n }\n try {\n const result = this.Record.Validate();\n this._fieldErrors = result.Errors.filter(e => e.Source === this.FieldName);\n } catch {\n this._fieldErrors = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Whether this field should be hidden (empty in read-only mode) */\n get ShouldHideField(): boolean {\n if (this.EditMode) return false;\n if (!this.HideWhenEmptyInReadOnlyMode) return false;\n if (this.FormContext?.showEmptyFields) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n /** Possible values for select/autocomplete from entity metadata or override */\n get PossibleValues(): string[] {\n if (this.PossibleValuesOverride) return this.PossibleValuesOverride;\n const values = this.FieldInfo?.EntityFieldValues;\n if (values && values.length > 0) {\n return values.map(v => v.Value);\n }\n return [];\n }\n\n /** Whether this field has a related entity (foreign key) */\n get HasRelatedEntity(): boolean {\n const re = this.FieldInfo?.RelatedEntity;\n return re != null && re.length > 0;\n }\n\n /**\n * For FK fields, returns the human-readable name to display instead of the raw ID.\n *\n * Resolution order:\n * 1. If `RelatedEntityNameFieldMap` exists, read the name from the joined field on the record (sync).\n * 2. Otherwise, fall back to an async `GetEntityRecordName` lookup (result cached in `_resolvedFKName`).\n */\n get FKDisplayName(): string | null {\n if (!this.Record || !this.HasRelatedEntity) return null;\n\n // If the FK value itself is null/empty, there's nothing to display\n // (the joined name field may still hold a stale cached value from the view)\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return null;\n\n // Fast path: name field is joined into our record's view\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const val = this.Record.Get(nameFieldMap);\n if (val != null && val !== '') return String(val);\n }\n\n // Async fallback: resolved via GetEntityRecordName\n if (this._resolvedFKName !== undefined) {\n return this._resolvedFKName;\n }\n\n // Kick off async resolution if not already in flight\n this.resolveFKNameAsync();\n return null; // will render once resolved\n }\n\n /**\n * Whether this FK field should display the related entity name\n * with a hyperlink instead of the raw ID value.\n */\n get IsFKWithNameField(): boolean {\n return this.HasRelatedEntity && this.FKDisplayName != null;\n }\n\n // ---- Async FK name resolution ----\n\n /** Cached result from GetEntityRecordName. undefined = not yet resolved. */\n private _resolvedFKName: string | null | undefined = undefined;\n\n /** Tracks which FK value we resolved so we can invalidate on record change */\n private _resolvedFKValue: unknown = undefined;\n\n /** Whether an async lookup is in flight */\n private _fkNameLoading = false;\n\n /**\n * Asynchronously resolves the display name for an FK field that lacks\n * a RelatedEntityNameFieldMap by calling Metadata.GetEntityRecordName.\n */\n private resolveFKNameAsync(): void {\n if (this._fkNameLoading) return;\n\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return;\n\n const fieldInfo = this.FieldInfo;\n if (!fieldInfo?.RelatedEntity || !fieldInfo?.RelatedEntityFieldName) return;\n\n this._fkNameLoading = true;\n this._resolvedFKValue = fkValue;\n\n const pk = new CompositeKey([{\n FieldName: fieldInfo.RelatedEntityFieldName,\n Value: fkValue\n }]);\n\n const md = this.ProviderToUse;\n md.GetEntityRecordName(fieldInfo.RelatedEntity, pk)\n .then(name => {\n this._resolvedFKName = name || null;\n this._fkNameLoading = false;\n this.cdr.markForCheck();\n })\n .catch(() => {\n this._resolvedFKName = null;\n this._fkNameLoading = false;\n });\n }\n\n // ============================================\n // DROPDOWN POSITIONING (shared by FK, value list, select)\n // ============================================\n\n /** Calculated position for fixed-position dropdowns */\n DropdownTop = 0;\n DropdownLeft = 0;\n DropdownWidth = 0;\n OpenAbove = false;\n\n /** Cleanup function for scroll/resize listeners */\n private _scrollCleanup: (() => void) | null = null;\n\n /** Inline style for the fixed-position dropdown */\n get DropdownPositionStyle(): Record<string, string> {\n if (this.OpenAbove) {\n return {\n 'position': 'fixed',\n 'bottom': (window.innerHeight - this.DropdownTop) + 'px',\n 'top': 'auto',\n 'left': this.DropdownLeft + 'px',\n 'width': this.DropdownWidth + 'px',\n 'z-index': '10000'\n };\n }\n return {\n 'position': 'fixed',\n 'top': this.DropdownTop + 'px',\n 'bottom': 'auto',\n 'left': this.DropdownLeft + 'px',\n 'width': this.DropdownWidth + 'px',\n 'z-index': '10000'\n };\n }\n\n /** Calculate dropdown position relative to viewport from anchor element */\n private updateDropdownPosition(anchorEl: HTMLElement): void {\n const rect = anchorEl.getBoundingClientRect();\n const dropdownMaxHeight = 240;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownMaxHeight && spaceAbove > spaceBelow) {\n this.OpenAbove = true;\n this.DropdownTop = rect.top - gap;\n } else {\n this.OpenAbove = false;\n this.DropdownTop = rect.bottom + gap;\n }\n this.DropdownLeft = rect.left;\n this.DropdownWidth = rect.width;\n }\n\n /** Start listening for scroll/resize to close dropdowns */\n private startScrollListener(): void {\n this.stopScrollListener();\n\n const onScroll = () => {\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n const onResize = () => {\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n\n document.addEventListener('scroll', onScroll, true); // capture phase catches all scrollable ancestors\n window.addEventListener('resize', onResize);\n\n this._scrollCleanup = () => {\n document.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }\n\n /** Remove scroll/resize listeners */\n private stopScrollListener(): void {\n if (this._scrollCleanup) {\n this._scrollCleanup();\n this._scrollCleanup = null;\n }\n }\n\n /** Close all dropdown types */\n private closeAllDropdowns(): void {\n this.ShowFKDropdown = false;\n this.ShowValueListDropdown = false;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n }\n\n // ============================================\n // FK AUTOCOMPLETE (custom implementation)\n // ============================================\n\n /** Suggestions returned from the FK entity search */\n FKSuggestions: FKSuggestion[] = [];\n\n /** Whether the current FK value is a confirmed match (user selected from dropdown) */\n FKIsMatched = false;\n\n /** Whether the FK dropdown is visible */\n ShowFKDropdown = false;\n\n /** Text the user is currently typing in the FK search input. null = use display name. */\n private _fkInputText: string | null = null;\n\n /** Debounce timer for FK search */\n private _fkSearchTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Last known FK input element for position recalculation */\n private _lastFKInputEl: HTMLElement | null = null;\n\n /** The display text shown in the FK search input */\n get FKSearchText(): string {\n if (this._fkInputText !== null) return this._fkInputText;\n return this.FKDisplayName || '';\n }\n\n /** Handle typing in the FK search input */\n OnFKInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._fkInputText = input.value;\n this._lastFKInputEl = input;\n this.FKIsMatched = false;\n\n // Debounce search\n if (this._fkSearchTimeout) clearTimeout(this._fkSearchTimeout);\n this._fkSearchTimeout = setTimeout(() => {\n if (this._fkInputText && this._fkInputText.length >= 1) {\n this.searchRelatedEntity(this._fkInputText);\n } else {\n this.FKSuggestions = [];\n this.ShowFKDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n }, 300);\n }\n\n /** Show dropdown on focus if suggestions exist */\n OnFKFocus(event: FocusEvent): void {\n const input = event.target as HTMLElement;\n this._lastFKInputEl = input;\n if (this.FKSuggestions.length > 0) {\n this.updateDropdownPosition(input);\n this.startScrollListener();\n this.ShowFKDropdown = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Hide dropdown on blur, revert to matched name if user didn't select */\n OnFKBlur(): void {\n // Small delay so mousedown on dropdown items fires first\n setTimeout(() => {\n this.ShowFKDropdown = false;\n this.stopScrollListener();\n // If user was typing but didn't select, revert to display name\n if (!this.FKIsMatched && this._fkInputText !== null) {\n this._fkInputText = null;\n }\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an item from the FK dropdown */\n OnFKSelectItem(suggestion: FKSuggestion, event: MouseEvent): void {\n event.preventDefault();\n this._fkInputText = suggestion.DisplayName;\n this.Value = suggestion.PrimaryKeyValue;\n this.FKIsMatched = true;\n this.ShowFKDropdown = false;\n this.stopScrollListener();\n\n // Update virtual name field for visual consistency after save\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, suggestion.DisplayName);\n }\n this.cdr.markForCheck();\n }\n\n /** Clear FK value via the X button */\n OnFKClearClick(event: MouseEvent): void {\n event.preventDefault();\n this.Value = null;\n this._fkInputText = null;\n this.FKIsMatched = false;\n this.FKSuggestions = [];\n this.ShowFKDropdown = false;\n this.stopScrollListener();\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, '');\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Perform a RunView search on the related entity's name field.\n * Falls back to searching by primary key when no NameField exists (single-field PKs only).\n */\n private async searchRelatedEntity(query: string): Promise<void> {\n const fieldInfo = this.FieldInfo;\n if (!fieldInfo?.RelatedEntity) return;\n\n const md = this.ProviderToUse;\n const relatedEntity = md.Entities.find(e => e.Name === fieldInfo.RelatedEntity);\n if (!relatedEntity) return;\n\n const nameField = relatedEntity.NameField;\n const pkFields = relatedEntity.PrimaryKeys;\n\n // If no NameField, fall back to PK — but only for single-field PKs\n if (!nameField) {\n if (!pkFields || pkFields.length !== 1) return;\n }\n\n const nameFieldName = nameField ? nameField.Name : pkFields[0].Name;\n const pkFieldName = fieldInfo.RelatedEntityFieldName || 'ID';\n\n // Build Fields array, avoiding duplicates when nameField IS the PK\n const fields = nameFieldName === pkFieldName\n ? [pkFieldName]\n : [pkFieldName, nameFieldName];\n\n const escapedQuery = query.replace(/'/g, \"''\");\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: fieldInfo.RelatedEntity,\n ExtraFilter: `[${nameFieldName}] LIKE '%${escapedQuery}%'`,\n MaxRows: 20,\n ResultType: 'simple',\n Fields: fields\n });\n\n if (result.Success) {\n this.FKSuggestions = result.Results.map(r => ({\n PrimaryKeyValue: r[pkFieldName],\n DisplayName: String(r[nameFieldName] || '')\n }));\n if (this.FKSuggestions.length > 0 && this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n }\n this.ShowFKDropdown = this.FKSuggestions.length > 0;\n } else {\n this.FKSuggestions = [];\n this.ShowFKDropdown = false;\n this.stopScrollListener();\n }\n this.cdr.markForCheck();\n }\n\n // ============================================\n // VALUE LIST AUTOCOMPLETE (for 'autocomplete' type)\n // ============================================\n\n /** Whether the value list dropdown is visible */\n ShowValueListDropdown = false;\n\n /** Current filter text for the value list */\n private _valueListFilter = '';\n\n /** Filtered possible values based on what the user typed */\n get FilteredPossibleValues(): string[] {\n if (!this._valueListFilter) return this.PossibleValues;\n const filter = this._valueListFilter.toLowerCase();\n return this.PossibleValues.filter(v => v.toLowerCase().includes(filter));\n }\n\n /** Handle typing in the value list autocomplete */\n OnValueListInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._valueListFilter = input.value;\n this.Value = input.value;\n this.updateDropdownPosition(input);\n if (!this._scrollCleanup) this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Show dropdown on focus */\n OnValueListFocus(event: FocusEvent): void {\n const input = event.target as HTMLElement;\n this.updateDropdownPosition(input);\n this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Hide dropdown on blur */\n OnValueListBlur(): void {\n setTimeout(() => {\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an item from the value list dropdown */\n OnValueListSelect(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this._valueListFilter = '';\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // CUSTOM SELECT DROPDOWN (replaces native <select>)\n // ============================================\n\n /** Whether the custom select dropdown is visible */\n ShowSelectDropdown = false;\n\n /** Toggle the custom select dropdown */\n OnSelectTriggerClick(event: Event): void {\n event.preventDefault();\n if (this.ShowSelectDropdown) {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n } else {\n const el = event.currentTarget as HTMLElement;\n this.updateDropdownPosition(el);\n this.startScrollListener();\n this.ShowSelectDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n /** Close the select dropdown on blur */\n OnSelectTriggerBlur(): void {\n setTimeout(() => {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an option from the custom select dropdown */\n OnSelectOptionClick(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // GENERAL PROPERTIES\n // ============================================\n\n /** Whether the field's varchar(max) - long text that gets markdown rendering */\n get IsLongText(): boolean {\n return this.FieldInfo?.Length === -1;\n }\n\n /** Format a value for display */\n FormatValue(): string {\n const val = this.Value;\n if (val === null || val === undefined) return '';\n if (val instanceof Date) {\n return val.toLocaleString();\n }\n return String(val);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['FormContext'] || changes['EditMode'] || changes['Record']) {\n // Reset FK state when record changes\n if (changes['Record']) {\n this._fkInputText = null;\n this.FKIsMatched = false;\n this.FKSuggestions = [];\n this.ShowFKDropdown = false;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n this._fkNameLoading = false;\n // Reset validation state for new record\n this._touched = false;\n this._fieldErrors = [];\n }\n // Reset validation state when exiting edit mode\n if (changes['EditMode'] && !this.EditMode) {\n this._touched = false;\n this._fieldErrors = [];\n }\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n if (this._fkSearchTimeout) {\n clearTimeout(this._fkSearchTimeout);\n }\n this.stopScrollListener();\n }\n\n // ---- Navigation Handlers ----\n\n /**\n * Handle click on a record FK link in read-only mode.\n */\n OnRecordLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.FieldInfo || !this.Record) return;\n const relatedEntityName = this.FieldInfo.RelatedEntity;\n if (!relatedEntityName) return;\n\n const fkValue = this.Value;\n if (!fkValue) return;\n\n // Build a CompositeKey for the FK target record using the related entity's PK field\n const relatedFieldName = this.FieldInfo.RelatedEntityFieldName || 'ID';\n const targetKey = new CompositeKey([new KeyValuePair(relatedFieldName, fkValue)]);\n\n this.Navigate.emit({\n Kind: 'record',\n EntityName: relatedEntityName,\n PrimaryKey: targetKey,\n OpenInNewTab: event.ctrlKey || event.metaKey\n });\n }\n\n /**\n * Handle click on an email link in read-only mode.\n */\n OnEmailLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const email = this.FormatValue();\n if (!email) return;\n this.Navigate.emit({\n Kind: 'email',\n EmailAddress: email\n });\n }\n\n /**\n * Handle click on a URL link in read-only mode.\n */\n OnUrlLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const url = this.FormatValue();\n if (!url) return;\n this.Navigate.emit({\n Kind: 'external-link',\n Url: url,\n OpenInNewTab: true\n });\n }\n\n /**\n * Handle value change from a native input.\n */\n OnInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value;\n }\n\n /**\n * Handle value change from a number input.\n */\n OnNumberChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const num = input.valueAsNumber;\n this.Value = isNaN(num) ? null : num;\n }\n\n /**\n * Handle value change from a date input.\n */\n OnDateChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value ? new Date(input.value) : null;\n }\n\n /**\n * Handle value change from a checkbox.\n */\n OnCheckboxChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.checked;\n }\n\n /**\n * Get date value formatted for HTML date input.\n */\n get DateInputValue(): string {\n const val = this.Value;\n if (!val) return '';\n const date = val instanceof Date ? val : new Date(String(val));\n if (isNaN(date.getTime())) return '';\n return date.toISOString().split('T')[0];\n }\n}\n","@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n </span>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\" [class.mj-fk-search--matched]=\"FKIsMatched\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n placeholder=\"Search...\">\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown && FKSuggestions.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnFKSelectItem(suggestion, $event)\">\n {{ suggestion.DisplayName }}\n </div>\n }\n </div>\n }\n </div>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n}\n"]}
1
+ {"version":3,"file":"form-field.component.js","sourceRoot":"","sources":["../../../src/lib/field/form-field.component.ts","../../../src/lib/field/form-field.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, OnChanges, SimpleChanges, OnDestroy, ElementRef, Renderer2 } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, EntityFieldInfo, EntityFieldTSType, CompositeKey, KeyValuePair, RunView } from '@memberjunction/core';\nimport { BaseEngineRegistry } from '@memberjunction/core';\nimport { ValidationErrorInfo, HighlightSearchMatches, detectRichTextFormat, RichTextFormat, UUIDsEqual } from '@memberjunction/global';\nimport { FormContext } from '../types/form-types';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { FormatFKCell, FilterCachedFKRows } from './fk-search-utils';\nimport { LinkedFieldOptionsStore } from './linked-field-options';\n\n/**\n * How a field's value should be rendered/edited beyond a plain input.\n * - `markdown` / `html`: render formatted in read mode, code editor in edit mode\n * - `code`: source code (uses the field's CodeType as the editor language)\n * - `plain`: standard text rendering (default)\n */\nexport type FieldRichTextMode = 'markdown' | 'html' | 'code' | 'plain';\n\n/**\n * One extra (non-name, non-PK) column rendered in an FK suggestion row.\n * Built from the related entity's fields where `DefaultInView === true`.\n */\nexport interface FKSuggestionColumn {\n /** Field code name on the related entity. */\n FieldName: string;\n /** Friendly column header (the field's DisplayNameOrName). */\n Header: string;\n /** Pre-formatted display value for this row+column. */\n Value: string;\n /**\n * {@link Value} with the query substring highlighted when this column is the one\n * being searched (else plain, still HTML-escaped). Bound to `[innerHTML]`.\n */\n HighlightedValue: string;\n}\n\n/**\n * A field the user can scope the FK search to, shown in the scope-picker menu.\n * `Group` separates the columns visible in the grid ('shown') from other\n * searchable fields like ID/Status ('other').\n */\nexport interface FKSearchableField {\n /** Related-entity field code name to search against. */\n FieldName: string;\n /** Friendly label (DisplayNameOrName) shown in the menu + scope pill. */\n Label: string;\n /** FontAwesome icon class for the menu row. */\n Icon: string;\n /** Which menu group this field belongs to. */\n Group: 'shown' | 'other';\n}\n\n/**\n * Represents a suggestion item for FK autocomplete search results.\n */\nexport interface FKSuggestion {\n /** Primary-key value used as the FK value when selected. */\n PrimaryKeyValue: unknown;\n /** The related entity's NameField value — the primary clickable label. */\n DisplayName: string;\n /** {@link DisplayName} with the typed query substring wrapped in a highlight mark. Bound to `[innerHTML]`. */\n HighlightedName: string;\n /** Additional DefaultInView columns shown to the right of the name (multi-column rows). */\n ExtraColumns: FKSuggestionColumn[];\n /**\n * Leading icon for this row — a FontAwesome class. Per-row when the related\n * entity has an `ExtendedType = 'Icon'` field; otherwise the entity-level\n * icon; null when neither exists.\n */\n Icon: string | null;\n}\n\n/**\n * Describes the column layout (besides the name column) for the FK suggestion\n * dropdown of the current related entity. Recomputed when the related entity changes.\n */\ninterface FKColumnPlan {\n /** Code name of the related entity's NameField (or PK fallback). */\n NameFieldName: string;\n /** Code name of the related entity's PK field used as the FK value. */\n PkFieldName: string;\n /**\n * The ordered list of ALL display columns INCLUDING the name field — this is the\n * user-reorderable column order. The name field is always present (can't be hidden)\n * but may sit anywhere in the order.\n */\n ColumnFields: string[];\n /** Non-name display columns (ColumnFields minus the name field), for cell building. */\n ExtraFieldNames: string[];\n /** Friendly headers for the extra columns, index-aligned with ExtraFieldNames. */\n ExtraHeaders: string[];\n /**\n * Code name of the related entity's `ExtendedType = 'Icon'` field, whose\n * per-row value is a FontAwesome class — or null if the entity has no such\n * field (then {@link EntityIcon} is used as a uniform fallback).\n */\n IconFieldName: string | null;\n /** Entity-level icon (`EntityInfo.Icon`) used when there's no per-row icon field. */\n EntityIcon: string | null;\n}\n\n/**\n * Modern form field component that renders entity fields in both read-only and edit modes.\n *\n * **Read mode**: Clean text display with optional hyperlinks (email, URL, record).\n * **Edit mode**: Native HTML inputs with custom-built select and autocomplete components.\n *\n * Uses:\n * - Native `<input>` for text, number, date\n * - Custom styled dropdown for value list selections\n * - Custom autocomplete with floating dropdown for foreign key search\n * - Custom-styled `<input type=\"checkbox\">` for booleans\n *\n * All navigation (clicking FK links, email links, URL links) is emitted as events.\n *\n * @example\n * ```html\n * <mj-form-field\n * [Record]=\"record\"\n * [EditMode]=\"editMode\"\n * FieldName=\"CustomerName\"\n * Type=\"textbox\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\"\n * (ValueChange)=\"onValueChange($event)\">\n * </mj-form-field>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.css']\n})\nexport class MjFormFieldComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private renderer = inject(Renderer2);\n private hostRef = inject(ElementRef<HTMLElement>);\n\n /** The entity record containing this field */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** The field code name (must match a field on the entity) */\n @Input() FieldName = '';\n\n /**\n * The control type to render in edit mode.\n * Determines which input component is used.\n *\n * Also accepts deprecated Kendo-style type names for backward compatibility:\n * - `'dropdownlist'` → `'select'`\n * - `'numerictextbox'` → `'number'`\n */\n @Input()\n set Type(value: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' | 'dropdownlist' | 'numerictextbox') {\n // Normalize deprecated Kendo type names to modern equivalents\n switch (value) {\n case 'dropdownlist': this._type = 'select'; break;\n case 'numerictextbox': this._type = 'number'; break;\n default: this._type = value; break;\n }\n }\n get Type(): 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' {\n return this._type;\n }\n private _type: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' = 'textbox';\n\n /**\n * Link type for read-only rendering.\n * - 'Email': renders as mailto link\n * - 'URL': renders as external hyperlink\n * - 'Record': renders as FK link to related entity record\n * - 'None': renders as plain text\n */\n @Input() LinkType: 'Email' | 'URL' | 'Record' | 'None' = 'None';\n\n /** Whether to show the field label */\n @Input() ShowLabel = true;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n /**\n * Whether FK / record links are interactive. Driven by\n * `FormContext.enableRecordLinks`; false renders FK values as plain text\n * (dialog/slide-in surfaces). Undefined / true means links are live.\n */\n get RecordLinksEnabled(): boolean {\n return this.FormContext?.enableRecordLinks !== false;\n }\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [Record] instead */\n @Input('record') set _deprecatedRecord(value: BaseEntity) { this.Record = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n /** Whether to hide this field when empty in read-only mode. Default: true */\n @Input() HideWhenEmptyInReadOnlyMode = true;\n\n /** Override display name (defaults to entity field metadata DisplayName) */\n @Input() DisplayNameOverride = '';\n\n /** Override possible values for select/autocomplete */\n @Input() PossibleValuesOverride: string[] | null = null;\n\n /** Emitted when the field value changes */\n @Output() ValueChange = new EventEmitter<{ FieldName: string; OldValue: unknown; NewValue: unknown }>();\n\n /** Emitted when a navigation action is triggered (FK link click, email click, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Computed Properties ----\n\n /** Get EntityFieldInfo metadata for this field */\n get FieldInfo(): EntityFieldInfo | undefined {\n return this.Record?.EntityInfo?.Fields?.find(f => f.Name === this.FieldName);\n }\n\n /** Display name from metadata or override */\n get DisplayName(): string {\n if (this.DisplayNameOverride) return this.DisplayNameOverride;\n\n // Friendly labels for standard MJ timestamp fields\n if (this.FieldName === '__mj_CreatedAt') return 'Created';\n if (this.FieldName === '__mj_UpdatedAt') return 'Updated';\n\n // For FK fields that have a mapped name field, use the name field's\n // friendly label (e.g., show \"Parent\" instead of \"Parent ID\")\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const nameField = this.Record?.EntityInfo?.Fields?.find(f => f.Name === nameFieldMap);\n if (nameField) {\n return nameField.DisplayNameOrName;\n }\n }\n\n return this.FieldInfo?.DisplayNameOrName ?? this.FieldName;\n }\n\n /** Display name with search highlighting applied. Output is bound to `[innerHTML]`. */\n get HighlightedDisplayName(): string {\n return HighlightSearchMatches(this.DisplayName, this.FormContext?.sectionFilter ?? '', 'mj-forms-search-highlight');\n }\n\n /** Current field value */\n get Value(): unknown {\n return this.Record?.Get(this.FieldName);\n }\n\n /** Set field value, mark touched, run validation, and emit change event */\n set Value(newValue: unknown) {\n if (!this.Record) return;\n const oldValue = this.Record.Get(this.FieldName);\n this.Record.Set(this.FieldName, newValue);\n this._touched = true;\n this.runFieldValidation();\n this.ValueChange.emit({ FieldName: this.FieldName, OldValue: oldValue, NewValue: newValue });\n }\n\n /** Whether this field is read-only based on entity metadata */\n get IsFieldReadOnly(): boolean {\n if (!this.FieldInfo) return false;\n return this.FieldInfo.ReadOnly;\n }\n\n /** Whether this field has been modified (dirty). Only shown for saved records (not new). */\n get IsDirty(): boolean {\n if (!this.Record || !this.Record.IsSaved) return false;\n const field = this.Record.Fields?.find(f => f.Name === this.FieldName);\n return field?.Dirty ?? false;\n }\n\n /** Whether this field is required (not nullable) */\n get IsRequired(): boolean {\n return this.FieldInfo?.AllowsNull === false;\n }\n\n /** Whether this is a required field that is currently empty (for validation styling) */\n get IsRequiredEmpty(): boolean {\n // Defer to the validation system when it has active errors for this field\n if (this.ShowErrors) return false;\n if (!this.IsRequired || !this.EditMode) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n // ---- INLINE VALIDATION ----\n\n /** Whether the user has interacted with (changed) this field */\n private _touched = false;\n\n /** Locally computed validation errors for this field */\n private _fieldErrors: ValidationErrorInfo[] = [];\n\n /** Validation errors for this field from the best available source */\n get FieldErrors(): ValidationErrorInfo[] {\n // If touched, use fresh local validation (covers real-time feedback)\n if (this._touched) {\n return this._fieldErrors;\n }\n // Otherwise use form-level errors from save failure (covers untouched fields)\n const contextErrors = this.FormContext?.validationErrors;\n if (contextErrors && contextErrors.length > 0) {\n return contextErrors.filter(e => e.Source === this.FieldName);\n }\n return [];\n }\n\n /** Whether to show validation messages (touched OR form-level showValidation) */\n get ShowValidation(): boolean {\n if (!this.EditMode || this.IsFieldReadOnly) return false;\n return this._touched || (this.FormContext?.showValidation === true);\n }\n\n /** Whether this field has active error-level validation failures to display */\n get ShowErrors(): boolean {\n return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');\n }\n\n /** Whether this field has active warning-level validation issues to display */\n get ShowWarnings(): boolean {\n return this.ShowValidation && !this.ShowErrors && this.FieldErrors.some(e => e.Type === 'Warning');\n }\n\n /** Error messages to render in the template */\n get DisplayErrors(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Failure');\n }\n\n /** Warning messages to render in the template */\n get DisplayWarnings(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Warning');\n }\n\n /**\n * Runs validation for this field using the full Record.Validate() method.\n * This captures both built-in field checks and custom Validate() overrides\n * (including cross-field rules). Results are filtered to this field only.\n */\n private runFieldValidation(): void {\n if (!this.Record || !this.EditMode) {\n this._fieldErrors = [];\n return;\n }\n try {\n const result = this.Record.Validate();\n this._fieldErrors = result.Errors.filter(e => e.Source === this.FieldName);\n } catch {\n this._fieldErrors = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Whether this field should be hidden (empty in read-only mode) */\n get ShouldHideField(): boolean {\n if (this.EditMode) return false;\n if (!this.HideWhenEmptyInReadOnlyMode) return false;\n if (this.FormContext?.showEmptyFields) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n /** Possible values for select/autocomplete from entity metadata or override */\n get PossibleValues(): string[] {\n if (this.PossibleValuesOverride) return this.PossibleValuesOverride;\n const values = this.FieldInfo?.EntityFieldValues;\n if (values && values.length > 0) {\n return values.map(v => v.Value);\n }\n return [];\n }\n\n /** Whether this field has a related entity (foreign key) */\n get HasRelatedEntity(): boolean {\n const re = this.FieldInfo?.RelatedEntity;\n return re != null && re.length > 0;\n }\n\n /**\n * For FK fields, returns the human-readable name to display instead of the raw ID.\n *\n * Resolution order:\n * 1. If `RelatedEntityNameFieldMap` exists, read the name from the joined field on the record (sync).\n * 2. Otherwise, fall back to an async `GetEntityRecordName` lookup (result cached in `_resolvedFKName`).\n */\n get FKDisplayName(): string | null {\n if (!this.Record || !this.HasRelatedEntity) return null;\n\n // If the FK value itself is null/empty, there's nothing to display\n // (the joined name field may still hold a stale cached value from the view)\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return null;\n\n // Fast path: name field is joined into our record's view\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const val = this.Record.Get(nameFieldMap);\n if (val != null && val !== '') return String(val);\n }\n\n // Async fallback: resolved via GetEntityRecordName\n if (this._resolvedFKName !== undefined) {\n return this._resolvedFKName;\n }\n\n // Kick off async resolution if not already in flight\n this.resolveFKNameAsync();\n return null; // will render once resolved\n }\n\n /**\n * Whether this FK field should display the related entity name\n * with a hyperlink instead of the raw ID value.\n */\n get IsFKWithNameField(): boolean {\n return this.HasRelatedEntity && this.FKDisplayName != null;\n }\n\n // ---- Async FK name resolution ----\n\n /** Cached result from GetEntityRecordName. undefined = not yet resolved. */\n private _resolvedFKName: string | null | undefined = undefined;\n\n /** Tracks which FK value we resolved so we can invalidate on record change */\n private _resolvedFKValue: unknown = undefined;\n\n /** Whether an async lookup is in flight */\n private _fkNameLoading = false;\n\n /**\n * Asynchronously resolves the display name for an FK field that lacks\n * a RelatedEntityNameFieldMap by calling Metadata.GetEntityRecordName.\n */\n private resolveFKNameAsync(): void {\n if (this._fkNameLoading) return;\n\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return;\n\n const fieldInfo = this.FieldInfo;\n if (!fieldInfo?.RelatedEntity || !fieldInfo?.RelatedEntityFieldName) return;\n\n this._fkNameLoading = true;\n this._resolvedFKValue = fkValue;\n\n const pk = new CompositeKey([{\n FieldName: fieldInfo.RelatedEntityFieldName,\n Value: fkValue\n }]);\n\n const md = this.ProviderToUse;\n md.GetEntityRecordName(fieldInfo.RelatedEntity, pk)\n .then(name => {\n this._resolvedFKName = name || null;\n this._fkNameLoading = false;\n this.cdr.markForCheck();\n })\n .catch(() => {\n this._resolvedFKName = null;\n this._fkNameLoading = false;\n });\n }\n\n // ============================================\n // DROPDOWN POSITIONING (shared by FK, value list, select)\n // ============================================\n\n /** Calculated position for fixed-position dropdowns */\n DropdownTop = 0;\n DropdownLeft = 0;\n /** Computed: dropdown is at least the trigger width, at most {@link DropdownMaxWidth}. */\n DropdownMinWidth = 0;\n DropdownMaxWidth = 0;\n OpenAbove = false;\n\n /**\n * Max width (px) of the FK suggestion dropdown. The panel grows to fit its\n * columns up to this cap (then scrolls horizontally). When null, defaults to\n * 2× the trigger width so multi-column rows aren't cramped by a narrow field.\n * Always additionally bounded by the viewport's right edge.\n */\n @Input() FKDropdownMaxWidth: number | null = null;\n\n /**\n * Whether to highlight the typed query substring within each suggestion's name\n * in the FK dropdown. On by default — uses the muted, theme-aware\n * `--mj-status-warning` highlight (not the old bright yellow). Set false for\n * plain, un-marked names.\n */\n @Input() FKHighlightMatches = true;\n\n /**\n * Whether to offer inline \"create new\" for the related record when the one you need\n * isn't found. The affordance only renders when this is true AND the current user can\n * create records of the related entity (entity allows creation + role permits it).\n */\n @Input() AllowFKCreate = true;\n\n /** Surface used for the inline create form: a modal dialog (default) or a slide-in. */\n @Input() FKCreatePresentation: 'dialog' | 'slide-in' = 'dialog';\n\n /** Cleanup function for scroll/resize listeners */\n private _scrollCleanup: (() => void) | null = null;\n\n /** Inline style for the fixed-position dropdown */\n get DropdownPositionStyle(): Record<string, string> {\n // min-width floors at the trigger width; max-width caps growth; the auto\n // intrinsic width then shrink-to-fits the columns between the two, and\n // `.mj-fk-options` scrolls horizontally once content exceeds the cap.\n const sizing = {\n 'min-width': this.DropdownMinWidth + 'px',\n 'max-width': this.DropdownMaxWidth + 'px',\n 'width': 'max-content',\n };\n if (this.OpenAbove) {\n return {\n 'position': 'fixed',\n 'bottom': (window.innerHeight - this.DropdownTop) + 'px',\n 'top': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n return {\n 'position': 'fixed',\n 'top': this.DropdownTop + 'px',\n 'bottom': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n\n /** Calculate dropdown position relative to viewport from anchor element */\n private updateDropdownPosition(anchorEl: HTMLElement): void {\n const rect = anchorEl.getBoundingClientRect();\n const dropdownMaxHeight = 240;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownMaxHeight && spaceAbove > spaceBelow) {\n this.OpenAbove = true;\n this.DropdownTop = rect.top - gap;\n } else {\n this.OpenAbove = false;\n this.DropdownTop = rect.bottom + gap;\n }\n this.DropdownLeft = rect.left;\n // At least the trigger width; up to FKDropdownMaxWidth (default 2×), but never\n // past the viewport's right edge. Content fills between min and max; overflow\n // scrolls horizontally.\n this.DropdownMinWidth = rect.width;\n const desiredMax = this.FKDropdownMaxWidth ?? rect.width * 2;\n this.DropdownMaxWidth = Math.max(rect.width, Math.min(desiredMax, window.innerWidth - rect.left - 8));\n }\n\n // ---- Dropdown portal (escape transformed ancestors) ----\n\n /**\n * The dropdown is `position: fixed` with viewport coords. Inside the slide-in /\n * dialog overlays (which use CSS `transform`), a `fixed` descendant is positioned\n * relative to the transformed ancestor instead of the viewport, so it renders\n * off-screen. Re-parenting the dropdown element to `document.body` removes it from\n * any transformed containing block, restoring true viewport-fixed positioning.\n *\n * Call after change detection has rendered the dropdown (microtask). Angular still\n * owns the node — when the structural `@if` tears it down it removes the node by\n * reference regardless of where it currently lives, so no manual cleanup is needed\n * beyond clearing our tracking pointer.\n */\n private portalDropdownToBody(): void {\n // Already portaled and still in the DOM → nothing to do (e.g. typing while open).\n if (this._portaledDropdownEl?.isConnected) return;\n\n // The dropdown is rendered by `@if (ShowFKDropdown)`. On the synchronous cached\n // path (focus → searchCachedEntity → applySuggestions) the element may not be in\n // the DOM yet when we first look, so retry across a few frames until it renders.\n // (The async DB path lands here post-render, so it succeeds on the first try.)\n const tryPortal = (retriesLeft: number): void => {\n const host = this.hostRef?.nativeElement;\n if (!host) return;\n const dropdown = host.querySelector('.mj-fk-dropdown') as HTMLElement | null;\n if (dropdown) {\n if (dropdown.parentElement !== document.body) {\n this.renderer.appendChild(document.body, dropdown);\n this._portaledDropdownEl = dropdown;\n }\n } else if (retriesLeft > 0) {\n setTimeout(() => tryPortal(retriesLeft - 1), 0);\n }\n };\n Promise.resolve().then(() => tryPortal(5));\n }\n\n /** Tracks a dropdown element we relocated to body so we can drop the reference on close. */\n private _portaledDropdownEl: HTMLElement | null = null;\n\n /** Start listening for scroll/resize to close dropdowns */\n private startScrollListener(): void {\n this.stopScrollListener();\n\n const onScroll = (e: Event) => {\n // Scrolling WITHIN the dropdown (vertical list or horizontal column scroll)\n // must not close it — only an ancestor/page scroll, which would detach the\n // fixed-position panel from its trigger, should.\n const target = e.target as Node | null;\n if (this._portaledDropdownEl && target && this._portaledDropdownEl.contains(target)) return;\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n const onResize = () => {\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n\n document.addEventListener('scroll', onScroll, true); // capture phase catches all scrollable ancestors\n window.addEventListener('resize', onResize);\n\n this._scrollCleanup = () => {\n document.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }\n\n /** Remove scroll/resize listeners */\n private stopScrollListener(): void {\n if (this._scrollCleanup) {\n this._scrollCleanup();\n this._scrollCleanup = null;\n }\n }\n\n /** Close all dropdown types */\n private closeAllDropdowns(): void {\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this._portaledDropdownEl = null;\n this.ShowValueListDropdown = false;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n }\n\n // ============================================\n // FK AUTOCOMPLETE (custom implementation)\n // ============================================\n\n /** Max rows shown on an empty-input focus-show (cached fast path only). */\n private static readonly FK_FOCUS_SHOW_LIMIT = 50;\n\n /** Max rows returned from a DB search. */\n private static readonly FK_DB_SEARCH_LIMIT = 20;\n\n /** Suggestions returned from the FK entity search */\n FKSuggestions: FKSuggestion[] = [];\n\n /**\n * The currently-linked record, pinned as a sticky \"Currently selected\" section at the\n * top of the dropdown (browse mode only). Null when there's no selection or the user is\n * actively filtering. Removed from {@link FKSuggestions} so it isn't listed twice.\n */\n FKSelectedSuggestion: FKSuggestion | null = null;\n\n /** Whether the current FK value is a confirmed match (user selected from dropdown) */\n FKIsMatched = false;\n\n /** Whether the FK dropdown is visible */\n ShowFKDropdown = false;\n\n /** Whether a DB search is currently in flight (drives the loading indicator). */\n FKLoading = false;\n\n /** True when a search completed with zero results (drives the \"No matches\" row). */\n FKNoMatches = false;\n\n /** Index of the keyboard-highlighted active suggestion (-1 = none). */\n FKActiveIndex = -1;\n\n /** Headers for the extra (DefaultInView) columns shown in the dropdown. */\n FKColumnHeaders: string[] = [];\n\n /** Field code names for the extra columns, index-aligned with {@link FKColumnHeaders}. */\n FKColumnFields: string[] = [];\n\n /** Code name of the name column (used as its sort key). */\n FKNameField = '';\n\n /** Whether rows render a leading icon column (drives the header's empty icon cell). */\n FKHasIconColumn = false;\n\n /** Active sort column (field code name), or null for natural (unsorted) order. */\n FKSortField: string | null = null;\n\n /** Active sort direction; only meaningful when {@link FKSortField} is set. */\n FKSortDir: 'asc' | 'desc' = 'asc';\n\n /** Unsorted snapshot of the current suggestions, used to restore natural order. */\n private _fkSuggestionsNatural: FKSuggestion[] = [];\n\n /** Text the user is currently typing in the FK search input. null = use display name. */\n private _fkInputText: string | null = null;\n\n /**\n * The active search query that produced the current results — `''` on a focus/clear\n * browse (full list), the typed text when filtering. Distinct from {@link _fkInputText},\n * which holds the *displayed* text (the selected record's name when not typing). This is\n * the correct signal for \"browse mode\" and for the create-footer label.\n */\n private _fkQuery = '';\n\n /** Debounce timer for FK search */\n private _fkSearchTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Last known FK input element for position recalculation */\n private _lastFKInputEl: HTMLElement | null = null;\n\n /** Monotonic token so a slow DB response from a stale query can't clobber a newer one. */\n private _fkSearchSeq = 0;\n\n /** Cached column plan for the current related entity (rebuilt on demand). */\n private _fkColumnPlan: FKColumnPlan | null = null;\n\n // ---- Scope / search-field picker (Option B) ----\n\n /** Related-entity field code name currently searched against (defaults to the name field). */\n FKSearchField = '';\n\n /** Friendly label of {@link FKSearchField}, shown on the scope pill. */\n FKSearchFieldLabel = '';\n\n /** Whether the scope-picker menu is open. */\n FKShowScopeMenu = false;\n\n /** Whether the FK input is focused — the scope pill only appears while focused. */\n FKFocused = false;\n\n /** Fields the user can scope the search to (name + shown columns + other fields). */\n FKSearchableFields: FKSearchableField[] = [];\n\n // ---- Per-user persisted prefs (scope / sort / column widths) ----\n\n /** User-resized column widths in px, keyed by related-entity field code name. */\n private _fkColWidths: Record<string, number> = {};\n\n /** The (host entity|field) pref key currently loaded; reload when it changes. */\n private _fkPrefKey: string | null = null;\n\n /** Active column-resize drag, or null when not resizing. */\n private _fkResize: { field: string; startX: number; startWidth: number } | null = null;\n private _fkResizeMove: ((e: MouseEvent) => void) | null = null;\n private _fkResizeUp: (() => void) | null = null;\n\n /** The display text shown in the FK search input */\n get FKSearchText(): string {\n if (this._fkInputText !== null) return this._fkInputText;\n return this.FKDisplayName || '';\n }\n\n /**\n * True when this FK currently points at a real record (has a value AND we can show\n * its name). Drives the \"linked\" affordance — the chain icon + accent — so the user\n * can tell at a glance this is a resolved link, not free text.\n */\n get FKHasLinkedValue(): boolean {\n return this.Value != null && this.Value !== '' && this.FKDisplayName != null;\n }\n\n /** Whether a dropdown row is the record currently linked by this FK (UUID-safe compare). */\n IsFKRowSelected(suggestion: FKSuggestion): boolean {\n const v = this.Value;\n const pk = suggestion.PrimaryKeyValue;\n if (v == null || pk == null) return false;\n return UUIDsEqual(String(v), String(pk));\n }\n\n /**\n * Resolves the related `EntityInfo` for this FK field via the instance provider\n * (multi-provider safe — never the global `Metadata`).\n */\n private getRelatedEntityInfo(): EntityInfo | undefined {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return undefined;\n return this.ProviderToUse.EntityByName(relatedName);\n }\n\n /**\n * Returns the LIVE cached array of records for the related entity IF a loaded\n * engine holds the full (unfiltered) set; otherwise null. Records are read-only —\n * never mutate. Wraps {@link BaseEngineRegistry.TryGetCachedRecords}.\n */\n private getCachedRecordsForRelatedEntity(): BaseEntity[] | null {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return null;\n const registry = BaseEngineRegistry.Instance;\n const records = registry.TryGetCachedRecords<BaseEntity>(relatedName, { unfilteredOnly: true });\n // Treat an empty (or absent) cache as \"no usable cache\" so callers fall through\n // to the DB path and still show options on focus — never a blank dropdown.\n return records && records.length > 0 ? records : null;\n }\n\n /**\n * Builds (and memoizes) the column plan for the related entity: the name field,\n * the PK field used as the FK value, and the extra `DefaultInView` columns\n * (excluding the name + PK). Returns null when the related entity can't be resolved\n * or has no usable name/PK.\n */\n private buildColumnPlan(): FKColumnPlan | null {\n if (this._fkColumnPlan) {\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n const relatedEntity = this.getRelatedEntityInfo();\n if (!relatedEntity) return null;\n\n const nameField = relatedEntity.NameField;\n const pkFields = relatedEntity.PrimaryKeys;\n if (!nameField && (!pkFields || pkFields.length !== 1)) return null;\n\n const nameFieldName = nameField ? nameField.Name : pkFields[0].Name;\n const pkFieldName = this.FieldInfo?.RelatedEntityFieldName || (pkFields?.[0]?.Name ?? 'ID');\n\n // A field flagged ExtendedType='Icon' holds a per-row icon class — render it\n // as the row's leading glyph, not as a text column.\n const iconField = relatedEntity.Fields.find(f => f.ExtendedType === 'Icon');\n const iconFieldName = iconField?.Name ?? null;\n\n const columnFields = this.computeOrderedColumns(relatedEntity, nameFieldName, pkFieldName, iconFieldName);\n const extraFieldNames = columnFields.filter(c => c !== nameFieldName);\n\n this._fkColumnPlan = {\n NameFieldName: nameFieldName,\n PkFieldName: pkFieldName,\n ColumnFields: columnFields,\n ExtraFieldNames: extraFieldNames,\n ExtraHeaders: extraFieldNames.map(n => this.labelForRelatedField(n)),\n IconFieldName: iconFieldName,\n EntityIcon: relatedEntity.Icon || null\n };\n this.FKSearchableFields = this.buildSearchableFields(this._fkColumnPlan);\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n /**\n * Whether a `DefaultInView` field is worth showing as an extra dropdown column.\n * Excludes columns that read as opaque noise to a human picking a record:\n * • Primary keys (UUIDs/identities).\n * • Foreign-key columns — these hold the related record's raw ID (e.g. `ParentID`\n * → a GUID), not a human-readable label. The view's joined *name* field (if it's\n * itself `DefaultInView`) is the readable substitute and is kept.\n */\n private isUsefulExtraColumn(f: EntityFieldInfo): boolean {\n if (f.IsPrimaryKey) return false;\n if (f.RelatedEntityID && f.RelatedEntityID.length > 0) return false; // foreign key → raw ID\n return true;\n }\n\n /**\n * The ordered list of display columns INCLUDING the name field — the user-reorderable\n * column order. Honors a user `visibleFields` override (exact set + order, letting them\n * add fields like ID, drop defaults, or move the name field); otherwise falls back to\n * `[name, ...DefaultInView columns]`. The name field is always guaranteed present, and\n * the icon field is never a text column.\n */\n private computeOrderedColumns(\n relatedEntity: EntityInfo, nameFieldName: string, pkFieldName: string, iconFieldName: string | null\n ): string[] {\n const exists = (n: string) => n !== iconFieldName && !!relatedEntity.Fields.find(f => f.Name === n);\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n\n let cols: string[];\n if (saved?.visibleFields) {\n cols = saved.visibleFields.filter(exists);\n // Migrate older prefs (stored extras-only, without the name field) and guarantee\n // the name field is always present.\n if (!cols.includes(nameFieldName)) cols = [nameFieldName, ...cols];\n } else {\n const defaults = relatedEntity.Fields\n .filter(f => f.DefaultInView && f.Name !== nameFieldName && f.Name !== pkFieldName\n && f.Name !== iconFieldName && this.isUsefulExtraColumn(f))\n .map(f => f.Name);\n cols = [nameFieldName, ...defaults];\n }\n\n // De-dupe (preserve order) and ensure the name field is present.\n const seen = new Set<string>();\n const ordered = cols.filter(c => (seen.has(c) ? false : (seen.add(c), true)));\n if (!ordered.includes(nameFieldName)) ordered.unshift(nameFieldName);\n return ordered;\n }\n\n // ============================================\n // SCOPE PICKER + PER-USER PREFS\n // ============================================\n\n /** Host entity name (the entity whose form this field belongs to), or null. */\n private get fkHostEntityName(): string | null {\n return this.Record?.EntityInfo?.Name ?? null;\n }\n\n /** This FK field's code name on the host entity, or null. */\n private get fkFieldCodeName(): string | null {\n return this.FieldInfo?.Name ?? null;\n }\n\n /** Whether the active search column is the name field (drives where we highlight). */\n private isSearchingNameField(plan: FKColumnPlan): boolean {\n return !this.FKSearchField || this.FKSearchField === plan.NameFieldName;\n }\n\n /** A field is scope-searchable if it's a string column (LIKE-able) and not a system column. */\n private isScopeSearchableField(f: EntityFieldInfo): boolean {\n if (f.TSType !== EntityFieldTSType.String) return false;\n if (f.Name.startsWith('__mj_')) return false;\n return true;\n }\n\n /** Friendly label for a related-entity field code name. */\n private labelForRelatedField(name: string): string {\n return this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name)?.DisplayNameOrName ?? name;\n }\n\n /** Whether a field code name exists on the related entity (guards stale saved prefs). */\n private isValidRelatedField(name: string): boolean {\n return !!this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name);\n }\n\n /**\n * Build the scope-picker field list: the name + shown columns ('shown' group),\n * then any other searchable string fields like ID/Status ('other' group).\n */\n private buildSearchableFields(plan: FKColumnPlan): FKSearchableField[] {\n const re = this.getRelatedEntityInfo();\n if (!re) return [];\n const iconFor = (fieldName: string) => {\n if (fieldName === plan.NameFieldName) return 'fa-solid fa-font';\n return re.Fields.find(x => x.Name === fieldName)?.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-tag';\n };\n // 'shown' group rendered in the actual column order so the menu matches the grid\n // (and so the up/down arrows hide correctly on the true first/last columns).\n const shown = new Set(plan.ColumnFields);\n const list: FKSearchableField[] = plan.ColumnFields.map(fieldName => ({\n FieldName: fieldName,\n Label: this.labelForRelatedField(fieldName),\n Icon: iconFor(fieldName),\n Group: 'shown' as const\n }));\n for (const f of re.Fields) {\n if (shown.has(f.Name) || f.Name === plan.IconFieldName) continue;\n if (!this.isScopeSearchableField(f)) continue;\n list.push({\n FieldName: f.Name,\n Label: f.DisplayNameOrName,\n Icon: f.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-font',\n Group: 'other'\n });\n }\n return list;\n }\n\n /**\n * Load this (host entity, FK field)'s saved prefs — search scope, sort, column\n * widths — once per field. No-ops when the field hasn't changed. Falls back to\n * defaults (search the name field, natural sort, content-sized columns) and only\n * applies a saved value when it still resolves to a real field.\n */\n private ensureLinkedFieldPrefsLoaded(plan: FKColumnPlan): void {\n const key = this.fkHostEntityName && this.fkFieldCodeName\n ? `${this.fkHostEntityName}|${this.fkFieldCodeName}` : null;\n if (key === this._fkPrefKey) return;\n this._fkPrefKey = key;\n\n // Defaults\n this.FKSearchField = plan.NameFieldName;\n this._fkColWidths = {};\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n if (saved) {\n if (saved.searchField && this.isValidRelatedField(saved.searchField)) {\n this.FKSearchField = saved.searchField;\n }\n if (saved.sortField !== undefined && (saved.sortField === null || this.isValidRelatedField(saved.sortField))) {\n this.FKSortField = saved.sortField;\n this.FKSortDir = saved.sortDir ?? 'asc';\n }\n if (saved.colWidths) this._fkColWidths = { ...saved.colWidths };\n }\n this.FKSearchFieldLabel = this.labelForRelatedField(this.FKSearchField);\n }\n\n /** Format a raw cell value for display in the dropdown (delegates to the pure helper). */\n private formatCell(val: unknown): string {\n return FormatFKCell(val);\n }\n\n /**\n * Build the suggestion view-models from a set of plain rows (cached or DB),\n * applying the typed-query substring highlight to the name column.\n * `getField` abstracts cached BaseEntity rows (`.Get(name)`) vs simple objects.\n */\n private buildSuggestions(\n rows: ReadonlyArray<{ get: (field: string) => unknown }>,\n plan: FKColumnPlan,\n query: string\n ): FKSuggestion[] {\n const searchField = this.FKSearchField || plan.NameFieldName;\n // Only highlight the column actually being searched, and only when enabled.\n const nameQuery = (this.FKHighlightMatches && this.isSearchingNameField(plan)) ? query : '';\n return rows.map(row => {\n const name = this.formatCell(row.get(plan.NameFieldName));\n // Per-row icon from the entity's ExtendedType='Icon' field; else the\n // entity-level icon; else none.\n const rowIcon = plan.IconFieldName ? this.formatCell(row.get(plan.IconFieldName)).trim() : '';\n return {\n PrimaryKeyValue: row.get(plan.PkFieldName),\n DisplayName: name,\n // Empty query yields the (still HTML-escaped) plain name — no marks.\n HighlightedName: HighlightSearchMatches(name, nameQuery, 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fieldName, i) => {\n const value = this.formatCell(row.get(fieldName));\n const colQuery = (this.FKHighlightMatches && fieldName === searchField) ? query : '';\n return {\n FieldName: fieldName,\n Header: plan.ExtraHeaders[i],\n Value: value,\n HighlightedValue: HighlightSearchMatches(value, colQuery, 'mj-forms-search-highlight')\n };\n }),\n Icon: (rowIcon || plan.EntityIcon) || null\n };\n });\n }\n\n /** Apply a freshly-built suggestion list to the dropdown state + reposition + portal. */\n private applySuggestions(suggestions: FKSuggestion[], plan: FKColumnPlan): void {\n // Pinned \"currently selected\" row: in browse mode (empty query) with a valid linked\n // value, lift the selected record into a sticky section and remove it from the list so\n // the user can keep it or pick another without clearing first.\n this.FKSelectedSuggestion = null;\n const browseMode = this._fkQuery.trim().length === 0;\n if (browseMode && this.FKHasLinkedValue) {\n const idx = suggestions.findIndex(s => this.IsFKRowSelected(s));\n if (idx >= 0) {\n this.FKSelectedSuggestion = suggestions[idx];\n suggestions = suggestions.filter((_, i) => i !== idx);\n } else {\n // Selected record isn't in the (first-N) result — show a lightweight pinned row.\n this.FKSelectedSuggestion = this.buildSelectedFallbackSuggestion(plan);\n }\n }\n\n this._fkSuggestionsNatural = suggestions;\n this.FKNameField = plan.NameFieldName;\n // Full ordered column list (incl. the name field) + matching headers.\n this.FKColumnFields = plan.ColumnFields;\n this.FKColumnHeaders = plan.ColumnFields.map(c => c === plan.NameFieldName ? 'Name' : this.labelForRelatedField(c));\n this.FKHasIconColumn = (this.FKSelectedSuggestion?.Icon != null) || suggestions.some(s => s.Icon != null);\n this.FKSuggestions = this.sortSuggestions(suggestions);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.FKNoMatches = suggestions.length === 0 && !this.FKSelectedSuggestion;\n\n // Show the dropdown for rows, a \"no matches\" state, or just the pinned selection.\n this.ShowFKDropdown = suggestions.length > 0 || this.FKNoMatches || !!this.FKSelectedSuggestion;\n if (this.ShowFKDropdown && this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Build a lightweight pinned row for the selected record when it isn't present in the\n * current result set (DB beyond first-N, or cached beyond the focus-show limit). We have\n * its display name from the FK name resolution; extra-column values are left blank.\n */\n private buildSelectedFallbackSuggestion(plan: FKColumnPlan): FKSuggestion | null {\n const name = this.FKDisplayName;\n if (this.Value == null || this.Value === '' || !name) return null;\n return {\n PrimaryKeyValue: this.Value,\n DisplayName: name,\n HighlightedName: HighlightSearchMatches(name, '', 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fn, i) => ({\n FieldName: fn, Header: plan.ExtraHeaders[i], Value: '', HighlightedValue: ''\n })),\n Icon: plan.EntityIcon ?? null\n };\n }\n\n /**\n * Returns a sorted copy of the suggestions per the active sort column/direction.\n * Null sort field → natural order (original array, untouched). Sorts on the name\n * column's `DisplayName` or the matching extra column's formatted `Value`,\n * case-insensitively.\n */\n private sortSuggestions(suggestions: FKSuggestion[]): FKSuggestion[] {\n const field = this.FKSortField;\n if (!field) return suggestions;\n const keyOf = (s: FKSuggestion): string => {\n if (field === this.FKNameField) return s.DisplayName ?? '';\n return s.ExtraColumns.find(c => c.FieldName === field)?.Value ?? '';\n };\n const dir = this.FKSortDir === 'desc' ? -1 : 1;\n return [...suggestions].sort((a, b) =>\n dir * keyOf(a).localeCompare(keyOf(b), undefined, { numeric: true, sensitivity: 'base' })\n );\n }\n\n /**\n * Toggle the sort on a column header: same column cycles asc → desc → none;\n * a new column starts at asc. Re-derives the visible list from the natural snapshot.\n */\n OnFKSortToggle(fieldName: string): void {\n if (this.FKSortField === fieldName) {\n if (this.FKSortDir === 'asc') this.FKSortDir = 'desc';\n else { this.FKSortField = null; this.FKSortDir = 'asc'; } // desc → cleared\n } else {\n this.FKSortField = fieldName;\n this.FKSortDir = 'asc';\n }\n this.FKSuggestions = this.sortSuggestions(this._fkSuggestionsNatural);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.persistLinkedFieldSort();\n this.cdr.markForCheck();\n }\n\n /** Persist the active sort for this (host entity, FK field) pair. */\n private persistLinkedFieldSort(): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSort(\n this.fkHostEntityName, this.fkFieldCodeName, this.FKSortField, this.FKSortDir\n );\n }\n }\n\n /** FontAwesome class for a column header's sort indicator (idle / asc / desc). */\n FKSortIcon(fieldName: string): string {\n if (this.FKSortField !== fieldName) return 'fa-solid fa-sort mj-fk-sort-icon mj-fk-sort-icon--idle';\n return this.FKSortDir === 'asc'\n ? 'fa-solid fa-sort-up mj-fk-sort-icon'\n : 'fa-solid fa-sort-down mj-fk-sort-icon';\n }\n\n // ---- Scope pill (search-field picker) ----\n\n /** Toggle the scope-picker menu. mousedown+preventDefault keeps the input focused. */\n OnFKScopeToggle(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.FKShowScopeMenu = !this.FKShowScopeMenu;\n this.cdr.markForCheck();\n }\n\n /** Whether a scope-menu row is the active search field. */\n IsFKScopeActive(field: FKSearchableField): boolean {\n return field.FieldName === (this.FKSearchField || this.FKNameField);\n }\n\n /** Whether there are non-visible searchable fields (drives the \"Other fields\" group). */\n get FKHasOtherSearchableFields(): boolean {\n return this.FKSearchableFields.some(f => f.Group === 'other');\n }\n\n /** User picked a field to search by — persist the override and re-run the search. */\n OnFKScopeSelect(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n this.selectScope(field);\n }\n\n /** Set the active search field (used by click + the no-drag path of menu drag). */\n private selectScope(field: FKSearchableField): void {\n this.FKSearchField = field.FieldName;\n this.FKSearchFieldLabel = field.Label;\n this.FKShowScopeMenu = false;\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSearchField(this.fkHostEntityName, this.fkFieldCodeName, field.FieldName);\n }\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n /** Re-run the active query against the (possibly newly-chosen) search field. */\n private rerunCurrentFKSearch(): void {\n const query = this._fkQuery;\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) this.searchCachedEntity(cached, query);\n else void this.searchRelatedEntity(query);\n }\n\n // ---- Column visibility (show/hide a field as a column) ----\n\n /** Whether a field is currently rendered as a column (the Name column is always shown). */\n IsFKColumnVisible(field: FKSearchableField): boolean {\n return field.FieldName === this.FKNameField || this.FKColumnFields.includes(field.FieldName);\n }\n\n /** Whether this field's column visibility can be toggled (Name is always shown). */\n CanToggleFKColumn(field: FKSearchableField): boolean {\n return field.FieldName !== this.FKNameField;\n }\n\n /**\n * Toggle whether a field shows as a column. Persists the full visible set, then\n * rebuilds the column plan + re-runs the search so the grid reflects it live.\n * stopPropagation so the row's search-scope click doesn't also fire.\n */\n OnFKColumnToggle(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.CanToggleFKColumn(field)) return;\n\n const next = [...this.FKColumnFields];\n const idx = next.indexOf(field.FieldName);\n if (idx >= 0) next.splice(idx, 1);\n else next.push(field.FieldName);\n this.applyVisibleColumns(next);\n }\n\n /** Persist a new visible-column set/order and rebuild the grid live. */\n private applyVisibleColumns(cols: string[]): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetVisibleFields(this.fkHostEntityName, this.fkFieldCodeName, cols);\n }\n this._fkColumnPlan = null; // force rebuild with the new column set/order\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n // ---- Column reorder (up/down arrows in the field-selector menu) ----\n\n /** Whether the column can move up (it's a column and not already first). */\n CanMoveFKColumnUp(field: string): boolean {\n return this.FKColumnFields.indexOf(field) > 0;\n }\n\n /** Whether the column can move down (it's a column and not already last). */\n CanMoveFKColumnDown(field: string): boolean {\n const i = this.FKColumnFields.indexOf(field);\n return i >= 0 && i < this.FKColumnFields.length - 1;\n }\n\n /**\n * Move a column one slot up (delta -1) or down (delta +1) and persist. mousedown +\n * stopPropagation so the row's select-scope handler doesn't fire and the menu stays open.\n */\n MoveFKColumn(event: MouseEvent, field: string, delta: -1 | 1): void {\n event.preventDefault();\n event.stopPropagation();\n const cols = [...this.FKColumnFields];\n const i = cols.indexOf(field);\n const j = i + delta;\n if (i < 0 || j < 0 || j >= cols.length) return;\n [cols[i], cols[j]] = [cols[j], cols[i]];\n this.applyVisibleColumns(cols);\n }\n\n /**\n * CSS `grid-template-columns` for the dropdown grid: optional icon column, then one\n * track per ordered column. The LAST column grows to fill any remaining width (`1fr`)\n * so the grid never leaves dead space on the right; earlier columns size to content.\n * A user-resized column uses its saved pixel width as the floor.\n */\n get FKGridTemplateColumns(): string {\n const cols: string[] = [];\n if (this.FKHasIconColumn) cols.push('min-content');\n const lastIdx = this.FKColumnFields.length - 1;\n this.FKColumnFields.forEach((field, i) => cols.push(this.fkColumnTrack(field, i === lastIdx)));\n return cols.join(' ');\n }\n\n /**\n * Track sizing for one column. Resized → fixed px (the last column still grows past it\n * via `1fr` when there's room). Default → content-sized, except the last column which\n * fills remaining space.\n */\n private fkColumnTrack(field: string, isLast: boolean): string {\n const w = this._fkColWidths[field];\n const min = field === this.FKNameField ? 120 : 80;\n if (w) return isLast ? `minmax(${w}px, 1fr)` : `${w}px`;\n return isLast ? `minmax(${min}px, 1fr)` : `minmax(${min}px, max-content)`;\n }\n\n /** Whether a column's cells should stretch to fill their track (last column or resized). */\n FKColumnFillsTrack(field: string, isLast: boolean): boolean {\n return isLast || this._fkColWidths[field] != null;\n }\n\n /** The built cell (value + highlighted html) for a non-name column of a suggestion. */\n FKCellFor(suggestion: FKSuggestion, field: string): FKSuggestionColumn | undefined {\n return suggestion.ExtraColumns.find(c => c.FieldName === field);\n }\n\n /** Header sort handler (grid headers click-to-sort only; drag-reorder is menu-only). */\n OnFKHeaderSort(event: MouseEvent, field: string): void {\n event.preventDefault(); // keep input focus so the body-portaled dropdown stays open\n this.OnFKSortToggle(field);\n }\n\n // ---- Column resize (drag a header's right edge) ----\n\n /** Begin resizing a column. stopPropagation so the header's sort handler doesn't fire. */\n OnFKColResizeStart(event: MouseEvent, field: string): void {\n event.preventDefault();\n event.stopPropagation();\n const headerCell = (event.target as HTMLElement).closest('.mj-fk-hcell') as HTMLElement | null;\n const startWidth = headerCell ? headerCell.offsetWidth : 120;\n this._fkResize = { field, startX: event.clientX, startWidth };\n this._fkResizeMove = (e: MouseEvent) => this.onFKColResizeMove(e);\n this._fkResizeUp = () => this.onFKColResizeEnd();\n document.addEventListener('mousemove', this._fkResizeMove);\n document.addEventListener('mouseup', this._fkResizeUp);\n }\n\n private onFKColResizeMove(e: MouseEvent): void {\n if (!this._fkResize) return;\n const width = Math.max(60, Math.round(this._fkResize.startWidth + (e.clientX - this._fkResize.startX)));\n this._fkColWidths = { ...this._fkColWidths, [this._fkResize.field]: width };\n this.cdr.markForCheck();\n }\n\n private onFKColResizeEnd(): void {\n if (this._fkResize) {\n const width = this._fkColWidths[this._fkResize.field];\n if (width && this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetColWidth(\n this.fkHostEntityName, this.fkFieldCodeName, this._fkResize.field, width\n );\n }\n }\n this.teardownFKResizeListeners();\n this.cdr.markForCheck();\n }\n\n private teardownFKResizeListeners(): void {\n if (this._fkResizeMove) document.removeEventListener('mousemove', this._fkResizeMove);\n if (this._fkResizeUp) document.removeEventListener('mouseup', this._fkResizeUp);\n this._fkResize = null;\n this._fkResizeMove = null;\n this._fkResizeUp = null;\n }\n\n /** Handle typing in the FK search input */\n OnFKInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._fkInputText = input.value;\n this._lastFKInputEl = input;\n this.FKIsMatched = false;\n\n const query = this._fkInputText;\n\n // Cached fast path: filter the in-memory array immediately (no DB, no debounce).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, query);\n return;\n }\n\n // DB path: debounce a RunView search. Empty query (cleared field) → first N,\n // so clearing the field reveals the list rather than closing it.\n if (this._fkSearchTimeout) clearTimeout(this._fkSearchTimeout);\n this._fkSearchTimeout = setTimeout(() => {\n void this.searchRelatedEntity(this._fkInputText ?? '');\n }, 300);\n }\n\n /**\n * Show dropdown on focus. With a cached-unfiltered entity we immediately show the\n * first N rows (sorted by name) even on empty input — zero DB round-trips. Without\n * a cache we keep prior behavior: only re-open if we already have suggestions.\n */\n OnFKFocus(event: FocusEvent): void {\n const input = event.target as HTMLInputElement;\n this._lastFKInputEl = input;\n this.FKFocused = true; // reveal the scope pill while focused\n // Select any pre-filled (linked) text so the first keystroke replaces it instead\n // of appending — matches how a searchable dropdown behaves.\n if (input.value) input.select();\n this.showInitialFKSuggestions();\n }\n\n /**\n * Show the initial suggestion list (no/empty query): the full set from a cached\n * unfiltered engine, otherwise the first N rows via a DB query. Used on focus and\n * when the field is cleared, so the user always sees options without typing.\n */\n private showInitialFKSuggestions(): void {\n // Always show the FULL list (empty query) on focus/clear — even when a value is\n // already selected — so the user can browse and re-pick like a normal dropdown.\n // Filtering only kicks in once they actually type (OnFKInput).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, '');\n return;\n }\n void this.searchRelatedEntity('');\n }\n\n /**\n * In-memory search over a cached-unfiltered entity array. Case-insensitive substring\n * on the name field. Empty query → first N rows sorted by name (focus-show). Instant,\n * no spinner, no DB.\n */\n private searchCachedEntity(records: ReadonlyArray<BaseEntity>, query: string): void {\n const plan = this.buildColumnPlan();\n if (!plan) { this.closeFKDropdown(); this.cdr.markForCheck(); return; }\n\n this._fkQuery = query;\n const accessor = (r: BaseEntity) => ({ get: (field: string) => r.Get(field) });\n const searchField = this.FKSearchField || plan.NameFieldName;\n const matches = FilterCachedFKRows(\n records,\n query,\n MjFormFieldComponent.FK_FOCUS_SHOW_LIMIT,\n r => r.Get(searchField)\n );\n\n this.FKLoading = false;\n this.applySuggestions(this.buildSuggestions(matches.map(accessor), plan, query), plan);\n }\n\n /** Hide dropdown on blur, revert to matched name if user didn't select */\n OnFKBlur(): void {\n // Small delay so mousedown on dropdown items / scope menu fires first\n setTimeout(() => {\n this.closeFKDropdown();\n this.FKShowScopeMenu = false;\n this.FKFocused = false; // hide the scope pill\n // If user was typing but didn't select, revert to display name\n if (!this.FKIsMatched && this._fkInputText !== null) {\n this._fkInputText = null;\n }\n this.cdr.markForCheck();\n }, 200);\n }\n\n /**\n * Keyboard navigation in the FK input: ArrowDown/ArrowUp move the active row,\n * Enter selects it, Escape closes the dropdown.\n */\n OnFKKeydown(event: KeyboardEvent): void {\n if (!this.ShowFKDropdown || this.FKSuggestions.length === 0) {\n if (event.key === 'Escape') { this.closeFKDropdown(); this.cdr.markForCheck(); }\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.FKActiveIndex = Math.min(this.FKActiveIndex + 1, this.FKSuggestions.length - 1);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.FKActiveIndex = Math.max(this.FKActiveIndex - 1, 0);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'Enter': {\n const active = this.FKSuggestions[this.FKActiveIndex];\n if (active) {\n event.preventDefault();\n this.selectFKSuggestion(active);\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closeFKDropdown();\n this.cdr.markForCheck();\n break;\n }\n }\n\n /** Scroll the keyboard-active option into view inside the (possibly portaled) dropdown. */\n private scrollActiveOptionIntoView(): void {\n Promise.resolve().then(() => {\n const dropdown = this._portaledDropdownEl\n ?? (this.hostRef?.nativeElement?.querySelector('.mj-fk-dropdown') as HTMLElement | null);\n const active = dropdown?.querySelectorAll('.mj-fk-option')[this.FKActiveIndex] as HTMLElement | undefined;\n active?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** Select an item from the FK dropdown (mouse) */\n OnFKSelectItem(suggestion: FKSuggestion, event: MouseEvent): void {\n event.preventDefault();\n this.selectFKSuggestion(suggestion);\n }\n\n /** Shared selection logic for mouse-click and keyboard-Enter. */\n private selectFKSuggestion(suggestion: FKSuggestion): void {\n this._fkInputText = suggestion.DisplayName;\n this.Value = suggestion.PrimaryKeyValue;\n this.FKIsMatched = true;\n this.closeFKDropdown();\n\n // Update virtual name field for visual consistency after save\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, suggestion.DisplayName);\n }\n this.cdr.markForCheck();\n }\n\n // ---- Inline \"create new related record\" ----\n\n /**\n * Whether to show the inline-create affordance: the field opts in (`AllowFKCreate`),\n * the related entity resolves, and the current user can create records of it (entity\n * allows creation + role permits — `GetUserPermisions().CanCreate` folds in `AllowCreateAPI`).\n */\n get CanCreateFK(): boolean {\n if (!this.AllowFKCreate) return false;\n const re = this.getRelatedEntityInfo();\n const user = this.ProviderToUse?.CurrentUser;\n if (!re || !user) return false;\n return re.GetUserPermisions(user)?.CanCreate === true;\n }\n\n /** Footer label: prefilled with the typed text when present, else generic \"create new\". */\n get FKCreateLabel(): string {\n const entityLabel = this.getRelatedEntityInfo()?.DisplayName || this.FieldInfo?.RelatedEntity || 'record';\n const query = this._fkQuery.trim();\n return query ? `Create \"${query}\"` : `Create new ${entityLabel}`;\n }\n\n /**\n * Ask the host (app layer) to create a new related record, prefilled with the typed\n * text as the name. We only EMIT the request — opening the form is the app's job (the\n * generic forms layer must not depend on the app-level form presenter). The host calls\n * `Complete(record)` when saved and we select it.\n */\n OnFKCreateNew(event: MouseEvent): void {\n event.preventDefault(); // don't blur the input before we capture the query\n const plan = this.buildColumnPlan();\n const relatedEntity = this.FieldInfo?.RelatedEntity;\n if (!plan || !relatedEntity) return;\n\n const query = this._fkQuery.trim();\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this.closeFKDropdown();\n this.cdr.markForCheck();\n\n const newRecordValues: Record<string, unknown> = {};\n if (query) newRecordValues[plan.NameFieldName] = query;\n\n this.Navigate.emit({\n Kind: 'create-related',\n EntityName: relatedEntity,\n NewRecordValues: Object.keys(newRecordValues).length ? newRecordValues : undefined,\n Presentation: this.FKCreatePresentation,\n Provider: this.Provider ?? undefined,\n Complete: (created: BaseEntity | null) => { if (created) this.selectCreatedFKRecord(created, plan); },\n });\n }\n\n /** Select a freshly-created related record as this field's value. */\n private selectCreatedFKRecord(created: BaseEntity, plan: FKColumnPlan): void {\n const pk = created.Get(plan.PkFieldName);\n if (pk == null) return;\n const name = this.formatCell(created.Get(plan.NameFieldName));\n this._fkInputText = name;\n this.Value = pk;\n this.FKIsMatched = true;\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) this.Record.Set(nameFieldMap, name);\n this.closeFKDropdown();\n this.cdr.markForCheck();\n }\n\n /** Clear FK value via the X button */\n OnFKClearClick(event: MouseEvent): void {\n // preventDefault keeps focus on the input (the button never steals it), so the\n // freshly-opened dropdown stays open for the user to pick a replacement.\n event.preventDefault();\n this.Value = null;\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, '');\n }\n\n // Re-open the full list — clearing almost always precedes picking something else.\n this.showInitialFKSuggestions();\n this.cdr.markForCheck();\n }\n\n /** Close the FK dropdown and reset its transient view state. */\n private closeFKDropdown(): void {\n this.ShowFKDropdown = false;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKActiveIndex = -1;\n this.FKSelectedSuggestion = null;\n this._portaledDropdownEl = null;\n this.stopScrollListener();\n }\n\n /**\n * Perform a RunView search on the related entity's name field (DB path — used only\n * when no loaded engine caches the related entity unfiltered).\n * Falls back to searching by primary key when no NameField exists (single-field PKs only).\n */\n private async searchRelatedEntity(query: string): Promise<void> {\n const plan = this.buildColumnPlan();\n const fieldInfo = this.FieldInfo;\n if (!plan || !fieldInfo?.RelatedEntity) return;\n\n this._fkQuery = query;\n const seq = ++this._fkSearchSeq;\n this.FKLoading = true;\n this.FKNoMatches = false;\n this.ShowFKDropdown = true;\n if (this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n\n // Build Fields: PK + name + extra DefaultInView columns + the searched field +\n // the per-row icon field (when present), deduped via Set.\n const searchField = this.FKSearchField || plan.NameFieldName;\n const fields = Array.from(new Set([\n plan.PkFieldName, plan.NameFieldName, ...plan.ExtraFieldNames, searchField,\n ...(plan.IconFieldName ? [plan.IconFieldName] : [])\n ]));\n const escapedQuery = query.replace(/'/g, \"''\").trim();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: fieldInfo.RelatedEntity,\n // Empty query (focus / cleared field) → no filter → first N rows.\n ExtraFilter: escapedQuery ? `[${searchField}] LIKE '%${escapedQuery}%'` : '',\n MaxRows: MjFormFieldComponent.FK_DB_SEARCH_LIMIT,\n ResultType: 'simple',\n Fields: fields\n });\n\n // Ignore stale responses (a newer keystroke already fired).\n if (seq !== this._fkSearchSeq) return;\n this.FKLoading = false;\n\n if (result.Success) {\n const accessor = (r: Record<string, unknown>) => ({ get: (field: string) => r[field] });\n this.applySuggestions(this.buildSuggestions(result.Results.map(accessor), plan, query), plan);\n } else {\n this.FKSuggestions = [];\n this.FKNoMatches = true;\n this.ShowFKDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n // ============================================\n // VALUE LIST AUTOCOMPLETE (for 'autocomplete' type)\n // ============================================\n\n /** Whether the value list dropdown is visible */\n ShowValueListDropdown = false;\n\n /** Current filter text for the value list */\n private _valueListFilter = '';\n\n /** Filtered possible values based on what the user typed */\n get FilteredPossibleValues(): string[] {\n if (!this._valueListFilter) return this.PossibleValues;\n const filter = this._valueListFilter.toLowerCase();\n return this.PossibleValues.filter(v => v.toLowerCase().includes(filter));\n }\n\n /** Handle typing in the value list autocomplete */\n OnValueListInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._valueListFilter = input.value;\n this.Value = input.value;\n this.updateDropdownPosition(input);\n if (!this._scrollCleanup) this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Show dropdown on focus */\n OnValueListFocus(event: FocusEvent): void {\n const input = event.target as HTMLElement;\n this.updateDropdownPosition(input);\n this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Hide dropdown on blur */\n OnValueListBlur(): void {\n setTimeout(() => {\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an item from the value list dropdown */\n OnValueListSelect(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this._valueListFilter = '';\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // CUSTOM SELECT DROPDOWN (replaces native <select>)\n // ============================================\n\n /** Whether the custom select dropdown is visible */\n ShowSelectDropdown = false;\n\n /** Toggle the custom select dropdown */\n OnSelectTriggerClick(event: Event): void {\n event.preventDefault();\n if (this.ShowSelectDropdown) {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n } else {\n const el = event.currentTarget as HTMLElement;\n this.updateDropdownPosition(el);\n this.startScrollListener();\n this.ShowSelectDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n /** Close the select dropdown on blur */\n OnSelectTriggerBlur(): void {\n setTimeout(() => {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an option from the custom select dropdown */\n OnSelectOptionClick(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // GENERAL PROPERTIES\n // ============================================\n\n /** Whether the field's varchar(max) - long text that gets the wide read-only style */\n get IsLongText(): boolean {\n return this.FieldInfo?.Length === -1;\n }\n\n /**\n * Whether this field is large enough to be a candidate for rich-text (markdown/html)\n * auto-detection. Generic & multi-platform: keys off the TS type and character length\n * rather than a specific SQL type, so nvarchar(max)/ntext (MaxLength === 0 means\n * unlimited) and longer fixed fields (nvarchar(400)/varchar(500)/...) all qualify,\n * while short strings, UUIDs, numbers, dates, etc. do not.\n */\n get IsRichTextEligible(): boolean {\n const fi = this.FieldInfo;\n if (!fi || fi.TSType !== EntityFieldTSType.String) return false;\n const maxLen = fi.MaxLength;\n return maxLen === 0 || maxLen >= 255;\n }\n\n /**\n * Resolved rendering mode for this field. Honors an explicit `ExtendedType` first\n * ('Markdown' | 'HTML' | 'Code'); when `ExtendedType` is null, falls back to lightweight\n * client-side content detection — but only for {@link IsRichTextEligible} long-text fields.\n */\n get RichTextMode(): FieldRichTextMode {\n const fi = this.FieldInfo;\n if (!fi) return 'plain';\n\n switch (fi.ExtendedType) {\n case 'Markdown': return 'markdown';\n case 'HTML': return 'html';\n case 'Code': return 'code';\n }\n\n // Any other explicit ExtendedType (Email, URL, Geo*, Tel, ...) is not rich text here.\n if (fi.ExtendedType != null) return 'plain';\n\n // ExtendedType is null → auto-detect, but only on eligible long-text fields.\n if (!this.IsRichTextEligible) return 'plain';\n\n return this.detectFormat();\n }\n\n /** Backing snapshot for {@link EditRichTextMode}; null until first computed for the session. */\n private _editRichTextMode: FieldRichTextMode | null = null;\n\n /**\n * Stable rendering mode for EDIT mode. Unlike {@link RichTextMode} (which re-detects on the\n * live value), this is snapshotted when edit mode is entered so that typing markdown/html into\n * a plain textarea doesn't swap the control out from under the user mid-keystroke. Explicit\n * ExtendedType always wins regardless; only the auto-detect branch is frozen for the session.\n */\n get EditRichTextMode(): FieldRichTextMode {\n if (this._editRichTextMode === null) {\n this._editRichTextMode = this.RichTextMode;\n }\n return this._editRichTextMode;\n }\n\n /** Cached detection result, keyed by the exact string value it was computed from. */\n private _detectCacheValue: string | null = null;\n private _detectCacheResult: RichTextFormat = 'plain';\n\n /** Memoized content detection so the getter stays cheap under OnPush change detection. */\n private detectFormat(): RichTextFormat {\n const raw = this.Value;\n const text = raw == null ? '' : String(raw);\n if (text !== this._detectCacheValue) {\n this._detectCacheValue = text;\n this._detectCacheResult = detectRichTextFormat(text);\n }\n return this._detectCacheResult;\n }\n\n /**\n * Editor language for the code editor. In edit mode it tracks the frozen\n * {@link EditRichTextMode}; in read mode it tracks the live {@link RichTextMode}.\n */\n get CodeEditorLanguage(): string {\n const mode = this.EditMode ? this.EditRichTextMode : this.RichTextMode;\n switch (mode) {\n case 'markdown': return 'markdown';\n case 'html': return 'html';\n case 'code': return this.codeTypeToLanguage(this.FieldInfo?.CodeType);\n default: return '';\n }\n }\n\n /** Map the field's CodeType metadata value to a CodeMirror language id. */\n private codeTypeToLanguage(codeType: string | null | undefined): string {\n switch (codeType) {\n case 'CSS': return 'css';\n case 'HTML': return 'html';\n case 'JavaScript': return 'javascript';\n case 'SQL': return 'sql';\n case 'TypeScript': return 'typescript';\n default: return ''; // 'Other' / null → plain code editing\n }\n }\n\n /** Handle value changes coming from the embedded code editor (emits a plain string). */\n OnCodeEditorChange(value: string): void {\n this.Value = value;\n }\n\n /** Format a value for display */\n FormatValue(): string {\n const val = this.Value;\n if (val === null || val === undefined) return '';\n if (val instanceof Date) {\n return val.toLocaleString();\n }\n return String(val);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['FormContext'] || changes['EditMode'] || changes['Record']) {\n // Reset FK state when record changes\n if (changes['Record']) {\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._fkQuery = '';\n this.FKSuggestions = [];\n this.FKSelectedSuggestion = null;\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKColumnHeaders = [];\n this.FKColumnFields = [];\n this.FKSortField = null;\n this.FKSortDir = 'asc';\n this._fkSuggestionsNatural = [];\n this.FKSearchableFields = [];\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this._fkColWidths = {};\n this._fkPrefKey = null; // force prefs reload for the new field\n this._portaledDropdownEl = null;\n this._fkColumnPlan = null;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n this._fkNameLoading = false;\n // Reset validation state for new record\n this._touched = false;\n this._fieldErrors = [];\n // Invalidate cached rich-text detection (recomputed lazily for the new value)\n this._detectCacheValue = null;\n this._detectCacheResult = 'plain';\n this._editRichTextMode = null;\n }\n // Reset validation state when exiting edit mode\n if (changes['EditMode'] && !this.EditMode) {\n this._touched = false;\n this._fieldErrors = [];\n }\n // Re-snapshot the edit-mode rendering decision whenever edit mode toggles\n if (changes['EditMode']) {\n this._editRichTextMode = null;\n }\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n if (this._fkSearchTimeout) {\n clearTimeout(this._fkSearchTimeout);\n }\n this.teardownFKResizeListeners();\n this.stopScrollListener();\n // If we relocated the dropdown to <body> and Angular tears us down while it's\n // still open, remove the orphaned node ourselves (Angular removes by reference,\n // but guard against a race where the view is destroyed before the @if updates).\n if (this._portaledDropdownEl && this._portaledDropdownEl.parentElement === document.body) {\n this.renderer.removeChild(document.body, this._portaledDropdownEl);\n }\n this._portaledDropdownEl = null;\n }\n\n // ---- Navigation Handlers ----\n\n /**\n * Handle click on a record FK link in read-only mode.\n */\n OnRecordLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.FieldInfo || !this.Record) return;\n const relatedEntityName = this.FieldInfo.RelatedEntity;\n if (!relatedEntityName) return;\n\n const fkValue = this.Value;\n if (!fkValue) return;\n\n // Build a CompositeKey for the FK target record using the related entity's PK field\n const relatedFieldName = this.FieldInfo.RelatedEntityFieldName || 'ID';\n const targetKey = new CompositeKey([new KeyValuePair(relatedFieldName, fkValue)]);\n\n this.Navigate.emit({\n Kind: 'record',\n EntityName: relatedEntityName,\n PrimaryKey: targetKey,\n OpenInNewTab: event.ctrlKey || event.metaKey\n });\n }\n\n /**\n * Handle click on an email link in read-only mode.\n */\n OnEmailLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const email = this.FormatValue();\n if (!email) return;\n this.Navigate.emit({\n Kind: 'email',\n EmailAddress: email\n });\n }\n\n /**\n * Handle click on a URL link in read-only mode.\n */\n OnUrlLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const url = this.FormatValue();\n if (!url) return;\n this.Navigate.emit({\n Kind: 'external-link',\n Url: url,\n OpenInNewTab: true\n });\n }\n\n /**\n * Handle value change from a native input.\n */\n OnInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value;\n }\n\n /**\n * Handle value change from a number input.\n */\n OnNumberChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const num = input.valueAsNumber;\n this.Value = isNaN(num) ? null : num;\n }\n\n /**\n * Handle value change from a date input.\n */\n OnDateChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value ? new Date(input.value) : null;\n }\n\n /**\n * Handle value change from a checkbox.\n */\n OnCheckboxChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.checked;\n }\n\n /**\n * Get date value formatted for HTML date input.\n */\n get DateInputValue(): string {\n const val = this.Value;\n if (!val) return '';\n const date = val instanceof Date ? val : new Date(String(val));\n if (isNaN(date.getTime())) return '';\n return date.toISOString().split('T')[0];\n }\n}\n","@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles — richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' — click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles — overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder ▲▼ — hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" — sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching…</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer — always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n}\n"]}