@memberjunction/ng-react 5.47.0 → 5.49.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.
@@ -62,8 +62,24 @@ export declare class MJReactComponent extends BaseAngularComponent implements Af
62
62
  set utilities(value: any);
63
63
  get utilities(): any;
64
64
  private _styles?;
65
+ private _themeStyles?;
66
+ private _themeStylesKey?;
67
+ private themeObserver?;
65
68
  set styles(value: Partial<ComponentStyles> | undefined);
66
69
  get styles(): Partial<ComponentStyles>;
70
+ /**
71
+ * Identifies the current theme so bridged styles can be memoized and refreshed
72
+ * when the user's mode (`data-theme`) or the org overlay (`data-theme-overlay`)
73
+ * changes. Non-DOM environments return a constant key.
74
+ */
75
+ private computeThemeKey;
76
+ /**
77
+ * Watches the document root for theme changes (`data-theme` / `data-theme-overlay`)
78
+ * and, when the theme flips, invalidates the bridged-styles cache and re-renders so
79
+ * the live React component picks up the new theme. No-op when styles are supplied
80
+ * explicitly or when there is no DOM.
81
+ */
82
+ private setupThemeObserver;
67
83
  private _savedUserSettings;
68
84
  set savedUserSettings(value: any);
69
85
  get savedUserSettings(): any;
@@ -9,7 +9,7 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
9
9
  import { ComponentSpec } from '@memberjunction/interactive-component-types';
10
10
  import { ReactBridgeService } from '../services/react-bridge.service';
11
11
  import { AngularAdapterService } from '../services/angular-adapter.service';
12
- import { createErrorBoundary, ComponentHierarchyRegistrar, resourceManager, reactRootManager, SetupStyles, ComponentRegistryService, resolveUserStateScope, userStateStorageKey, parseStoredUserSettings, mergeUserSettings, applyUserSettingsUpdate } from '@memberjunction/react-runtime';
12
+ import { createErrorBoundary, ComponentHierarchyRegistrar, resourceManager, reactRootManager, BuildStylesFromTheme, wrapWithLibraryThemeProviders, ComponentRegistryService, resolveUserStateScope, userStateStorageKey, parseStoredUserSettings, mergeUserSettings, applyUserSettingsUpdate } from '@memberjunction/react-runtime';
13
13
  import { createRuntimeUtilities } from '../utilities/runtime-utilities';
14
14
  import { LogError, CompositeKey, RunView, DataSnapshot, DataTable, MJColumnDescriptor } from '@memberjunction/core';
15
15
  import { MJNotificationService } from '@memberjunction/ng-notifications';
@@ -74,14 +74,60 @@ export class MJReactComponent extends BaseAngularComponent {
74
74
  this._styles = value;
75
75
  }
76
76
  get styles() {
77
- // Lazy initialization - only create default styles when needed
78
- if (!this._styles) {
79
- this._styles = SetupStyles();
77
+ // An explicitly-provided styles input always wins.
78
+ if (this._styles) {
79
+ return this._styles;
80
+ }
81
+ // Otherwise bridge the host's live MJ theme (--mj-* tokens) into ComponentStyles
82
+ // so generated components inherit the active theme — including dark mode and
83
+ // hover/active/focus state families — instead of the frozen defaults. Memoized
84
+ // per theme key; invalidated by the MutationObserver on data-theme changes.
85
+ const key = this.computeThemeKey();
86
+ if (!this._themeStyles || this._themeStylesKey !== key) {
87
+ this._themeStyles = BuildStylesFromTheme();
88
+ this._themeStylesKey = key;
80
89
  if (this.enableLogging) {
81
- console.log('MJReactComponent: Auto-initialized styles using SetupStyles()');
90
+ console.log(`MJReactComponent: Bridged styles from live theme (key="${key}")`);
82
91
  }
83
92
  }
84
- return this._styles;
93
+ return this._themeStyles;
94
+ }
95
+ /**
96
+ * Identifies the current theme so bridged styles can be memoized and refreshed
97
+ * when the user's mode (`data-theme`) or the org overlay (`data-theme-overlay`)
98
+ * changes. Non-DOM environments return a constant key.
99
+ */
100
+ computeThemeKey() {
101
+ if (typeof document === 'undefined') {
102
+ return 'no-dom';
103
+ }
104
+ const root = document.documentElement;
105
+ return `${root.getAttribute('data-theme') || 'light'}|${root.getAttribute('data-theme-overlay') || ''}`;
106
+ }
107
+ /**
108
+ * Watches the document root for theme changes (`data-theme` / `data-theme-overlay`)
109
+ * and, when the theme flips, invalidates the bridged-styles cache and re-renders so
110
+ * the live React component picks up the new theme. No-op when styles are supplied
111
+ * explicitly or when there is no DOM.
112
+ */
113
+ setupThemeObserver() {
114
+ if (this._styles || typeof MutationObserver === 'undefined' || typeof document === 'undefined') {
115
+ return;
116
+ }
117
+ this.themeObserver = new MutationObserver(() => {
118
+ const key = this.computeThemeKey();
119
+ if (key !== this._themeStylesKey) {
120
+ this._themeStyles = undefined;
121
+ this._themeStylesKey = undefined;
122
+ if (this.isInitialized) {
123
+ this.renderComponent();
124
+ }
125
+ }
126
+ });
127
+ this.themeObserver.observe(document.documentElement, {
128
+ attributes: true,
129
+ attributeFilter: ['data-theme', 'data-theme-overlay'],
130
+ });
85
131
  }
86
132
  set savedUserSettings(value) {
87
133
  this._savedUserSettings = value || {};
@@ -189,6 +235,8 @@ export class MJReactComponent extends BaseAngularComponent {
189
235
  });
190
236
  // Trigger change detection to show loading state
191
237
  this.cdr.detectChanges();
238
+ // Refresh bridged theme styles when the user's mode / org overlay changes.
239
+ this.setupThemeObserver();
192
240
  await this.initializeComponent();
193
241
  }
194
242
  ngOnDestroy() {
@@ -196,6 +244,8 @@ export class MJReactComponent extends BaseAngularComponent {
196
244
  this.isDestroying = true;
197
245
  // Cancel any pending renders
198
246
  this.pendingRender = false;
247
+ this.themeObserver?.disconnect();
248
+ this.themeObserver = undefined;
199
249
  this.destroyed$.next();
200
250
  this.destroyed$.complete();
201
251
  this.cleanup();
@@ -657,8 +707,13 @@ export class MJReactComponent extends BaseAngularComponent {
657
707
  logErrors: true,
658
708
  recovery: 'retry'
659
709
  });
660
- // Create element with error boundary
661
- const element = React.createElement(ErrorBoundary, null, React.createElement(this.compiledComponent.component, props));
710
+ // Create element with error boundary. Auto-theme component libraries (antd) from
711
+ // the live MJ theme by wrapping the mounted tree in their theme provider — antd
712
+ // components don't read styles.* on their own and would otherwise render in their
713
+ // built-in light theme even in dark mode. One wrap themes every antd component in
714
+ // the subtree; no-op when antd isn't loaded.
715
+ const themedComponent = wrapWithLibraryThemeProviders(React, React.createElement(this.compiledComponent.component, props), libraries, this.styles);
716
+ const element = React.createElement(ErrorBoundary, null, themedComponent);
662
717
  // Render with timeout protection using resource manager
663
718
  const timeoutId = resourceManager.setTimeout(this.componentId, () => {
664
719
  // Check if still rendering and not destroyed
@@ -1213,5 +1268,5 @@ export class MJReactComponent extends BaseAngularComponent {
1213
1268
  type: ViewChild,
1214
1269
  args: ['container', { read: ElementRef, static: true }]
1215
1270
  }] }); })();
1216
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJReactComponent, { className: "MJReactComponent", filePath: "lib/components/mj-react-component.component.ts", lineNumber: 156 }); })();
1271
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJReactComponent, { className: "MJReactComponent", filePath: "lib/components/mj-react-component.component.ts", lineNumber: 158 }); })();
1217
1272
  //# sourceMappingURL=mj-react-component.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mj-react-component.component.js","sourceRoot":"","sources":["../../../src/lib/components/mj-react-component.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular component that hosts React components with proper memory management.\n * Provides a bridge between Angular and React ecosystems in MemberJunction applications.\n * @module @memberjunction/ng-react\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ComponentSpec, ComponentCallbacks, ComponentStyles, ComponentObject, BaseEventArgs } from '@memberjunction/interactive-component-types';\nimport { ReactBridgeService } from '../services/react-bridge.service';\nimport { AngularAdapterService } from '../services/angular-adapter.service';\nimport {\n createErrorBoundary,\n ComponentHierarchyRegistrar,\n resourceManager,\n reactRootManager,\n ResolvedComponents,\n SetupStyles,\n ComponentRegistryService,\n resolveUserStateScope,\n userStateStorageKey,\n parseStoredUserSettings,\n mergeUserSettings,\n applyUserSettingsUpdate\n} from '@memberjunction/react-runtime';\nimport { createRuntimeUtilities } from '../utilities/runtime-utilities';\nimport { LogError, CompositeKey, KeyValuePair, Metadata, RunView, RunViewParams, RunViewResult, RunQueryParams, RunQueryResult, DataSnapshot, DataTable, MJColumnDescriptor } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ComponentMetadataEngine, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ComponentUtilities, SimpleRunView, SimpleRunQuery } from '@memberjunction/interactive-component-types';\n\n/**\n * A captured RunView/RunQuery result with its original parameters.\n * Used by the automatic data capture system for components that don't\n * implement getCurrentDataState().\n */\ninterface CapturedDataResult {\n /** Entity name or query name */\n sourceName: string;\n /** 'view' or 'query' */\n sourceType: 'view' | 'query';\n /** Original RunView/RunQuery params */\n params: Record<string, unknown>;\n /** Returned rows */\n rows: Record<string, unknown>[];\n /** Total available rows (may differ from rows.length due to pagination) */\n totalRows: number;\n /** When the data was fetched */\n fetchedAt: Date;\n}\n\n/**\n * Event emitted by React components\n */\nexport interface ReactComponentEvent {\n type: string;\n payload: any;\n}\n\n/**\n * State change event emitted when component state updates\n */\nexport interface StateChangeEvent {\n path: string;\n value: any;\n}\n\n/**\n * User settings changed event emitted when component saves user preferences\n */\nexport interface UserSettingsChangedEvent {\n settings: Record<string, any>;\n componentName?: string;\n timestamp: Date;\n}\n\n/**\n * Angular component that hosts React components with proper memory management.\n * This component provides a bridge between Angular and React, allowing React components\n * to be used seamlessly within Angular applications.\n */\n@Component({\n standalone: false,\n selector: 'mj-react-component',\n template: `\n <div class=\"react-component-wrapper\">\n <div #container class=\"react-component-container\" [class.loading]=\"!isInitialized\"></div>\n @if (!isInitialized && !hasError) {\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"loading-text\">Loading component...</div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .react-component-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .react-component-container {\n width: 100%;\n height: 100%;\n transition: opacity 0.3s ease;\n }\n .react-component-container.loading {\n opacity: 0;\n }\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n }\n .loading-spinner {\n font-size: 48px;\n color: #5B4FE9;\n margin-bottom: 16px;\n }\n .loading-text {\n font-family: -apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: #64748B;\n margin-top: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJReactComponent extends BaseAngularComponent implements AfterViewInit, OnDestroy {\n private _component!: ComponentSpec;\n\n /**\n * The component specification to render.\n * When this changes after initialization, the component will be reinitialized\n * to load and render the new specification.\n */\n @Input()\n set component(value: ComponentSpec) {\n const previousComponent = this._component;\n this._component = value;\n\n // If already initialized and component spec changed, reinitialize\n if (this.isInitialized && value && previousComponent !== value) {\n // Check if it's actually a different component (not just same reference)\n const isDifferent = !previousComponent ||\n previousComponent.name !== value.name ||\n previousComponent.code !== value.code ||\n previousComponent.version !== value.version;\n\n if (isDifferent) {\n this.reinitializeComponent();\n }\n }\n }\n get component(): ComponentSpec {\n return this._component;\n }\n\n /**\n * Controls verbose logging for component lifecycle and operations.\n * Note: This does NOT control which React build (dev/prod) is loaded.\n * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.\n */\n @Input() enableLogging: boolean = false;\n @Input() useComponentManager: boolean = true; // NEW: Use unified ComponentManager by default\n \n // Auto-initialize utilities if not provided\n private _utilities: any;\n @Input()\n set utilities(value: any) {\n this._utilities = value;\n }\n get utilities(): any {\n // Lazy initialization - only create default utilities when needed\n if (!this._utilities) {\n const runtimeUtils = createRuntimeUtilities();\n this._utilities = runtimeUtils.buildUtilities(this.enableLogging);\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized utilities using createRuntimeUtilities()');\n }\n }\n return this._utilities;\n }\n \n // Auto-initialize styles if not provided\n private _styles?: Partial<ComponentStyles>;\n @Input()\n set styles(value: Partial<ComponentStyles> | undefined) {\n this._styles = value;\n }\n get styles(): Partial<ComponentStyles> {\n // Lazy initialization - only create default styles when needed\n if (!this._styles) {\n this._styles = SetupStyles();\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized styles using SetupStyles()');\n }\n }\n return this._styles;\n }\n \n private _savedUserSettings: any = {};\n @Input()\n set savedUserSettings(value: any) {\n this._savedUserSettings = value || {};\n // Re-render if component is initialized\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get savedUserSettings(): any {\n return this._savedUserSettings;\n }\n\n /**\n * Optional explicit scope for per-user settings persistence. When omitted, the\n * scope defaults to `<namespace>/<name>` of the component spec. Settings are\n * stored per-user via `UserInfoEngine` under the key\n * `InteractiveComponents_UserState_Root/<scope>`. Provide an\n * explicit scope when a single component spec is rendered in multiple distinct\n * contexts that should NOT share preferences (e.g. the same form spec used for\n * different entities) — set it to something stable and unique per context.\n */\n @Input() UserStateScope?: string;\n\n /**\n * When `true` (default), the host transparently persists `savedUserSettings`\n * per-user, cross-device via `UserInfoEngine` — seeding the component from\n * storage on load and saving (debounced) on every `onSaveUserSettings` call,\n * auto-scoped per component. Set to `false` to opt out and own persistence\n * yourself by handling the `userSettingsChanged` output instead.\n */\n @Input() PersistUserSettings: boolean = true;\n\n /**\n * Host-supplied props spread into the React component's props alongside the\n * standard `utilities`, `callbacks`, `components`, `styles`, `libraries`, and\n * `savedUserSettings`. Used by hosts that need to push data context the React\n * component can't fetch itself — e.g. `InteractiveFormComponent` passing\n * `FormHostProps` (the current record snapshot, mode, permissions).\n *\n * Standard keys take precedence over caller-supplied keys to keep the\n * platform contract stable.\n */\n private _componentProps: object = {};\n @Input()\n set componentProps(value: object | undefined) {\n this._componentProps = value ?? {};\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get componentProps(): object {\n return this._componentProps;\n }\n\n @Output() stateChange = new EventEmitter<StateChangeEvent>();\n @Output() componentEvent = new EventEmitter<ReactComponentEvent>();\n @Output() refreshData = new EventEmitter<void>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; key: CompositeKey }>();\n @Output() userSettingsChanged = new EventEmitter<UserSettingsChangedEvent>();\n /** Emitted once after the component successfully loads and resolvedComponentSpec is populated. */\n @Output() initialized = new EventEmitter<void>();\n \n @ViewChild('container', { read: ElementRef, static: true }) container!: ElementRef<HTMLDivElement>;\n\n // ─── Automatic data capture ───\n // Stores RunView/RunQuery results for components that don't implement getCurrentDataState().\n // Cleared on component reinitialize. Used as fallback in GetCurrentDataState().\n private capturedData: CapturedDataResult[] = [];\n\n private reactRootId: string | null = null;\n private compiledComponent: ComponentObject | null = null;\n private loadedDependencies: Record<string, ComponentObject> = {};\n private destroyed$ = new Subject<void>();\n private currentCallbacks: ComponentCallbacks | null = null;\n isInitialized = false;\n private isRendering = false;\n private pendingRender = false;\n private isDestroying = false;\n private componentId: string;\n private componentVersion: string = ''; // Store the version for resolver\n hasError = false;\n \n /**\n * Public property containing the fully resolved component specification.\n * This includes all external code fetched from registries, allowing consumers\n * to inspect the complete resolved specification including dependencies.\n * Only populated after successful component initialization.\n */\n public resolvedComponentSpec: ComponentSpec | null = null;\n\n constructor(\n private reactBridge: ReactBridgeService,\n private adapter: AngularAdapterService,\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n // Generate unique component ID for resource tracking\n this.componentId = `mj-react-component-${Date.now()}-${Math.random()}`;\n }\n\n async ngAfterViewInit() {\n // Try to get registry size safely\n let registrySize = 'N/A';\n try {\n if (this.adapter.isInitialized()) {\n registrySize = this.adapter.getRegistry().size().toString();\n } else {\n registrySize = 'Not initialized yet';\n }\n } catch (e) {\n registrySize = 'Not available';\n }\n \n console.log(`🎬 [ngAfterViewInit] Starting component initialization:`, {\n componentId: this.componentId,\n componentName: this.component?.name,\n timestamp: new Date().toISOString(),\n registrySize: registrySize\n });\n \n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n await this.initializeComponent();\n }\n\n ngOnDestroy() {\n // Set destroying flag immediately\n this.isDestroying = true;\n\n // Cancel any pending renders\n this.pendingRender = false;\n\n this.destroyed$.next();\n this.destroyed$.complete();\n this.cleanup();\n }\n\n /**\n * Reinitialize the component when the input spec changes.\n * Cleans up the current component and initializes with the new spec.\n */\n private async reinitializeComponent() {\n // Don't reinitialize if we're being destroyed\n if (this.isDestroying) {\n return;\n }\n\n // Clear cached state from previous component\n this.compiledComponent = null;\n this.resolvedComponentSpec = null;\n this.loadedDependencies = {};\n this.componentVersion = '';\n this.hasError = false;\n this.isInitialized = false;\n this.capturedData = [];\n\n // Unmount existing React root if present\n if (this.reactRootId) {\n this.isRendering = false;\n this.pendingRender = false;\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n\n // Initialize with the new component spec\n await this.initializeComponent();\n }\n\n /**\n * Initialize the React component\n */\n private async initializeComponent() {\n try {\n // Ensure React is loaded\n await this.reactBridge.getReactContext();\n\n // Wait for React to be fully ready (handles first-load delay)\n await this.reactBridge.waitForReactReady();\n\n // NEW: Use ComponentManager if enabled (default: true)\n if (this.useComponentManager) {\n console.log(`🎯 [initializeComponent] Using NEW ComponentManager approach`);\n await this.loadComponentWithManager();\n \n // Component is already compiled and stored in this.compiledComponent\n // No need to fetch from registry - it's already set\n } else {\n console.log(`📦 [initializeComponent] Using legacy approach (will be deprecated)`);\n // Register component hierarchy (this compiles and registers all components including from registries)\n await this.registerComponentHierarchy();\n \n // The resolved spec should now be available from the registration result\n // No need to fetch again\n \n // Get the already-registered component from the registry\n const registry = this.adapter.getRegistry();\n \n console.log(`🔍 [initializeComponent] Looking for component in registry:`, {\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: this.componentVersion\n });\n \n // Let's also check what's actually in the registry\n // Note: ComponentRegistry doesn't have a list() method, so we'll skip this for now\n \n const componentWrapper = registry.get(\n this.component.name, \n this.component.namespace || 'Global', \n this.componentVersion\n );\n \n console.log(`🔍 [initializeComponent] Registry.get result:`, {\n found: !!componentWrapper,\n type: componentWrapper ? typeof componentWrapper : 'undefined',\n hasComponent: componentWrapper ? !!componentWrapper.component : false\n });\n \n if (!componentWrapper) {\n const source = this.component.registry ? `external registry ${this.component.registry}` : 'local registry';\n console.error(`❌ [initializeComponent] Component not found! Details:`, {\n searchedName: this.component.name,\n searchedNamespace: this.component.namespace || 'Global',\n searchedVersion: this.componentVersion,\n source: source\n });\n throw new Error(`Component ${this.component.name} was not found in registry after registration from ${source}`);\n }\n \n // The registry now stores ComponentObjects directly\n // Validate it has the expected structure\n if (!componentWrapper || typeof componentWrapper !== 'object') {\n throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);\n }\n \n if (!componentWrapper.component) {\n throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);\n }\n \n // Now that we use a regular HOC wrapper, components should always be functions\n if (typeof componentWrapper.component !== 'function') {\n throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);\n }\n \n this.compiledComponent = componentWrapper;\n } // End of else block for legacy approach\n \n // Create managed React root\n const reactContext = this.reactBridge.getCurrentContext();\n if (!reactContext) {\n throw new Error('React context not available');\n }\n \n this.reactRootId = reactRootManager.createRoot(\n this.container.nativeElement,\n (container: HTMLElement) => reactContext.ReactDOM.createRoot(container),\n this.componentId\n );\n\n // Seed savedUserSettings from durable per-user storage before the first\n // render so the component mounts with the user's persisted preferences.\n await this.seedUserSettingsFromStore();\n\n // Initial render\n this.renderComponent();\n this.isInitialized = true;\n\n // Trigger change detection since we're using OnPush\n this.cdr.detectChanges();\n\n // Notify parent that the component has successfully initialized and\n // resolvedComponentSpec is now populated with the full spec from the registry\n this.initialized.emit();\n\n } catch (error) {\n this.hasError = true;\n LogError(`Failed to initialize React component: ${error}`);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error instanceof Error ? error.message : String(error),\n source: 'initialization'\n }\n });\n // Trigger change detection to show error state\n this.cdr.detectChanges();\n }\n }\n \n\n /**\n * Generate a hash from component code for versioning\n * Uses a simple hash function that's fast and sufficient for version differentiation\n */\n private generateComponentHash(spec: ComponentSpec): string {\n // Collect all code from the component hierarchy\n const codeStrings: string[] = [];\n \n const collectCode = (s: ComponentSpec) => {\n if (s.code) {\n codeStrings.push(s.code);\n }\n if (s.dependencies) {\n for (const dep of s.dependencies) {\n collectCode(dep);\n }\n }\n };\n \n collectCode(spec);\n \n // Generate hash from concatenated code\n const fullCode = codeStrings.join('|');\n let hash = 0;\n for (let i = 0; i < fullCode.length; i++) {\n const char = fullCode.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Convert to hex string and take first 8 characters for readability\n const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);\n return `v${hexHash}`;\n }\n\n /**\n * Resolve components using the runtime's resolver\n */\n private async resolveComponentsWithVersion(spec: ComponentSpec, version: string, namespace: string = 'Global'): Promise<ResolvedComponents> {\n const resolver = this.adapter.getResolver();\n \n // Debug: Log what dependencies we're trying to resolve\n if (this.enableLogging) {\n console.log(`Resolving components for ${spec.name}. Dependencies:`, spec.dependencies);\n }\n \n // Use the runtime's resolver which now handles registry-based components\n const resolved = await resolver.resolveComponents(\n spec, \n namespace,\n this.ProviderToUse.CurrentUser // Pass current user context for database operations\n );\n \n if (this.enableLogging) {\n console.log(`Resolved ${Object.keys(resolved).length} components for version ${version}:`, Object.keys(resolved));\n }\n return resolved;\n }\n\n\n /**\n * NEW: Load component using unified ComponentManager - MUCH SIMPLER!\n */\n private async loadComponentWithManager() {\n try {\n const manager = this.adapter.getComponentManager();\n \n console.log(`🚀 [ComponentManager] Loading component hierarchy: ${this.component.name}`);\n \n // Load the entire hierarchy with one simple call\n const result = await manager.loadHierarchy(this.component, {\n contextUser: this.ProviderToUse.CurrentUser,\n defaultNamespace: 'Global',\n defaultVersion: this.component.version || this.generateComponentHash(this.component),\n returnType: 'both'\n });\n \n if (!result.success) {\n const errorMessages = result.errors.map(e => `${e.componentName}: ${e.message}`).join(', ');\n console.error(`❌ [ComponentManager] Failed to load hierarchy:`, errorMessages);\n throw new Error(`Component loading failed: ${errorMessages}`);\n }\n \n // Store the results (handle undefined values)\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n this.compiledComponent = result.rootComponent || null;\n this.componentVersion = result.resolvedSpec?.version || this.component.version || 'latest';\n \n // IMPORTANT: Store the loaded dependencies for use in renderComponent\n this.loadedDependencies = result.components || {};\n \n console.log(`✅ [ComponentManager] Successfully loaded hierarchy:`, {\n rootComponent: result.resolvedSpec?.name,\n loadedCount: result.loadedComponents.length,\n dependencies: Object.keys(this.loadedDependencies),\n stats: result.stats\n });\n \n // Component is ready to render\n return true;\n \n } catch (error) {\n console.error(`❌ [ComponentManager] Error loading component:`, error);\n throw error;\n }\n }\n\n /**\n * Register all components in the hierarchy\n * @deprecated Use loadComponentWithManager() instead\n */\n private async registerComponentHierarchy() {\n // Use semantic version from spec or generate hash-based version for uniqueness\n const version = this.component.version || this.generateComponentHash(this.component);\n this.componentVersion = version; // Store for use in resolver\n \n console.log(`🔍 [registerComponentHierarchy] Starting registration for ${this.component.name}@${version}`, {\n location: this.component.location,\n registry: this.component.registry,\n namespace: this.component.namespace,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Check if already registered to avoid duplication\n const registry = this.adapter.getRegistry();\n const checkNamespace = this.component.namespace || 'Global';\n \n console.log(`🔍 [registerComponentHierarchy] Checking registry for existing component:`, {\n name: this.component.name,\n namespace: checkNamespace,\n version: version,\n registrySize: registry.size(),\n registryId: registry.registryId || 'unknown'\n });\n \n // Log registry state for debugging\n console.log(`📦 [registerComponentHierarchy] Registry state:`, {\n totalSize: registry.size(),\n registryInstance: registry.registryId || 'unknown'\n });\n \n const existingComponent = registry.get(this.component.name, checkNamespace, version);\n \n if (existingComponent) {\n console.log(`⚠️ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered!`, {\n existingType: typeof existingComponent,\n hasComponent: !!(existingComponent as any).component,\n registrationTime: (existingComponent as any).registeredAt || 'unknown',\n runtimeContextLibraries: Object.keys(this.adapter.getRuntimeContext().libraries || {})\n });\n \n // For registry components, we need to check the resolved spec's libraries, not the input spec\n // The input spec from Angular doesn't have library information for registry components\n if (this.component.location === 'registry' && this.component.registry) {\n console.log(`📋 [registerComponentHierarchy] Component is from registry, need to fetch full spec to check libraries`);\n // Continue to fetch the full spec below - don't return early\n } else {\n // For local components, check using the input spec\n const requiredLibraries = this.component.libraries || [];\n const runtimeLibraries = this.adapter.getRuntimeContext().libraries || {};\n const missingLibraries = requiredLibraries.filter(lib => !runtimeLibraries[lib.globalVariable]);\n \n if (missingLibraries.length > 0) {\n console.warn(`⚠️ [registerComponentHierarchy] Component registered but libraries missing:`, {\n required: requiredLibraries.map(l => l.globalVariable),\n loaded: Object.keys(runtimeLibraries),\n missing: missingLibraries.map(l => l.globalVariable)\n });\n // Don't return early - continue to load libraries\n } else {\n console.log(`✅ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered with all libraries, skipping`);\n return;\n }\n }\n } else {\n console.log(`🆕 [registerComponentHierarchy] Component not found in registry, proceeding with registration`);\n }\n \n // Initialize metadata engine\n await ComponentMetadataEngine.Instance.Config(false, this.ProviderToUse.CurrentUser);\n \n // Use the runtime's hierarchy registrar\n const registrar = new ComponentHierarchyRegistrar(\n this.adapter.getCompiler(),\n this.adapter.getRegistry(),\n this.adapter.getRuntimeContext()\n );\n \n console.log(`📦 [registerComponentHierarchy] Calling registrar.registerHierarchy for ${this.component.name}`, {\n hasStyles: !!this.styles,\n namespace: this.component.namespace || 'Global',\n version: version,\n libraryCount: ComponentMetadataEngine.Instance.ComponentLibraries?.length || 0,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Register with proper configuration\n // Pass the partial spec - the React runtime will handle fetching from registries\n const result = await registrar.registerHierarchy(\n this.component, // Pass the original spec, not fetched\n {\n styles: this.styles as ComponentStyles,\n namespace: this.component.namespace || 'Global',\n version: version,\n allowOverride: false, // Each version is unique\n allLibraries: ComponentMetadataEngine.Instance.ComponentLibraries,\n debug: true,\n contextUser: this.ProviderToUse.CurrentUser\n }\n );\n \n if (!result.success) {\n const errors = result.errors.map(e => e.error).join(', ');\n console.error(`❌ [registerComponentHierarchy] Registration failed:`, errors);\n throw new Error(`Component registration failed: ${errors}`);\n }\n \n // Store the resolved spec from the registration result\n if (result.resolvedSpec) {\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n console.log(`📋 [registerComponentHierarchy] Received resolved spec from runtime:`, {\n name: result.resolvedSpec.name,\n hasCode: !!result.resolvedSpec.code,\n libraryCount: result.resolvedSpec.libraries?.length || 0,\n dependencyCount: result.resolvedSpec.dependencies?.length || 0\n });\n }\n \n console.log(`✅ [registerComponentHierarchy] Successfully registered ${result.registeredComponents.length} components:`, result.registeredComponents);\n \n // Verify the component is actually in the registry\n const verifyComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);\n console.log(`🔍 [registerComponentHierarchy] Verification - component in registry after registration:`, {\n found: !!verifyComponent,\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: version,\n componentType: verifyComponent ? typeof verifyComponent : 'not found'\n });\n }\n\n /**\n * Post-process resolved spec to ensure all components show their true registry source.\n * This enriches the spec for UI display purposes to show where components actually came from.\n * Applied to all resolved specs so any consumer of this wrapper benefits.\n */\n private enrichSpecWithRegistryInfo(spec: ComponentSpec | null): ComponentSpec | null {\n if (!spec || !this.component) return spec;\n \n // Create a deep copy to avoid mutating the original\n const enrichedSpec = JSON.parse(JSON.stringify(spec));\n \n // Recursive function to process spec and all dependencies\n // Takes the original spec at the same level to find registry info\n const processSpec = (currentSpec: ComponentSpec, originalSpec: ComponentSpec) => {\n // If this component has code but shows location as 'embedded', \n // check the original spec to see where it came from\n if (currentSpec.code && currentSpec.location === 'embedded' && currentSpec.name) {\n // Try to find this component in the original spec at the same level\n // First check if the original spec itself matches by name\n if (originalSpec.name === currentSpec.name) {\n // Use the original's registry info if it had any\n if (originalSpec.location === 'registry' || originalSpec.registry) {\n currentSpec.location = 'registry';\n if (originalSpec.registry) {\n currentSpec.registry = originalSpec.registry;\n }\n if (originalSpec.namespace) {\n currentSpec.namespace = originalSpec.namespace;\n }\n }\n }\n \n // Also check in original's dependencies for a match\n if (originalSpec.dependencies) {\n const originalDep = originalSpec.dependencies.find(d => d.name === currentSpec.name);\n if (originalDep && (originalDep.location === 'registry' || originalDep.registry)) {\n currentSpec.location = 'registry';\n if (originalDep.registry) {\n currentSpec.registry = originalDep.registry;\n }\n if (originalDep.namespace) {\n currentSpec.namespace = originalDep.namespace;\n }\n }\n }\n }\n \n // Process all dependencies recursively\n if (currentSpec.dependencies && Array.isArray(currentSpec.dependencies)) {\n currentSpec.dependencies.forEach((dep, index) => {\n // Find the corresponding original dependency by name or use the one at same index\n let originalDep = originalSpec.dependencies?.find(d => d.name === dep.name);\n if (!originalDep && originalSpec.dependencies && index < originalSpec.dependencies.length) {\n originalDep = originalSpec.dependencies[index];\n }\n if (originalDep) {\n processSpec(dep, originalDep);\n }\n });\n }\n };\n \n processSpec(enrichedSpec, this.component);\n return enrichedSpec;\n }\n\n /**\n * Render the React component\n */\n private async renderComponent() {\n // Don't render if component is being destroyed\n if (this.isDestroying) {\n return;\n }\n \n if (!this.compiledComponent || !this.reactRootId) {\n return;\n }\n\n // Prevent concurrent renders\n if (this.isRendering) {\n this.pendingRender = true;\n return;\n }\n\n const context = this.reactBridge.getCurrentContext();\n if (!context) {\n return;\n }\n\n this.isRendering = true;\n const { React } = context;\n \n // Resolve components with the correct version using runtime's resolver\n // SKIP this if using ComponentManager - components are already loaded!\n let components = {};\n if (!this.useComponentManager) {\n components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);\n } else {\n // Use the dependencies that were already loaded and unwrapped by ComponentManager\n components = this.loadedDependencies;\n console.log(`🎯 [renderComponent] Using dependencies from ComponentManager:`, Object.keys(components));\n }\n \n // Create callbacks once per component instance\n if (!this.currentCallbacks) {\n this.currentCallbacks = this.createCallbacks();\n }\n \n // Get libraries from runtime context\n const runtimeContext = this.adapter.getRuntimeContext();\n const libraries = runtimeContext.libraries || {};\n \n // Build props — wrap utilities with data capture for fallback snapshot support.\n // Host-supplied componentProps spread first so platform-provided keys\n // (utilities, callbacks, components, styles, libraries, savedUserSettings,\n // onSaveUserSettings) always win — the contract stays stable regardless of\n // what a host passes in.\n const wrappedUtilities = this.wrapUtilitiesWithCapture(this.utilities);\n const props = {\n ...this._componentProps,\n utilities: wrappedUtilities,\n callbacks: this.currentCallbacks,\n components,\n styles: this.styles as any,\n libraries, // Pass the loaded libraries to components\n savedUserSettings: this._savedUserSettings,\n onSaveUserSettings: this.handleSaveUserSettings.bind(this)\n };\n\n // Validate component before creating element\n if (!this.compiledComponent.component) {\n LogError(`Component is undefined for ${this.component.name} during render`);\n return;\n }\n \n // Components should be functions after HOC wrapping\n if (typeof this.compiledComponent.component !== 'function') {\n LogError(`Component is not a function for ${this.component.name}: ${typeof this.compiledComponent.component}`);\n return;\n }\n\n // Create error boundary\n const ErrorBoundary = createErrorBoundary(React, {\n onError: this.handleReactError.bind(this),\n logErrors: true,\n recovery: 'retry'\n });\n\n // Create element with error boundary\n const element = React.createElement(\n ErrorBoundary,\n null,\n React.createElement(this.compiledComponent.component, props)\n );\n\n // Render with timeout protection using resource manager\n const timeoutId = resourceManager.setTimeout(\n this.componentId,\n () => {\n // Check if still rendering and not destroyed\n if (this.isRendering && !this.isDestroying) {\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: 'Component render timeout - possible infinite loop detected',\n source: 'render'\n }\n });\n }\n },\n 5000,\n { purpose: 'render-timeout-protection' }\n );\n\n // Use managed React root for rendering\n reactRootManager.render(\n this.reactRootId,\n element,\n () => {\n // Clear the timeout as render completed\n resourceManager.clearTimeout(this.componentId, timeoutId);\n \n // Don't update state if component is destroyed\n if (this.isDestroying) {\n return;\n }\n \n this.isRendering = false;\n \n // If there was a pending render request, execute it now\n if (this.pendingRender) {\n this.pendingRender = false;\n this.renderComponent();\n }\n }\n );\n }\n\n /**\n * Create callbacks for the React component\n */\n private createCallbacks(): ComponentCallbacks {\n return {\n RegisterMethod: (_methodName: string, _handler: any) => {\n // The component compiler wrapper will handle this internally\n // This is just a placeholder to satisfy the interface\n // The actual registration happens in the wrapper component\n },\n CreateSimpleNotification: (message: string, style: \"none\" | \"success\" | \"error\" | \"warning\" | \"info\", hideAfter?: number) => {\n // Use the MJ notification service to display the notification\n const notificationStyle = style as \"none\" | \"success\" | \"error\" | \"warning\" | \"info\" | undefined;\n this.notificationService.CreateSimpleNotification(\n message, \n style, \n hideAfter\n );\n },\n OpenEntityRecord: async (entityName: string, key: CompositeKey) => {\n let keyToUse: CompositeKey | null = null;\n if (key instanceof Array) {\n keyToUse = CompositeKey.FromKeyValuePairs(key);\n }\n else if (typeof key === 'object' && !!key.GetValueByFieldName) {\n keyToUse = key as CompositeKey;\n }\n else if (typeof key === 'object') {\n //} && !!key.FieldName && !!key.Value) {\n // possible that have an object that is a simple key/value pair with\n // FieldName and value properties\n const keyAny = key as any;\n if (keyAny.FieldName && keyAny.Value) {\n keyToUse = CompositeKey.FromKeyValuePairs([keyAny as KeyValuePair]);\n }\n }\n if (keyToUse) {\n // now in some cases we have key/value pairs that the component we are hosting\n // use, but are not the pkey, so if that is the case, we'll run a quick view to try\n // and get the pkey so that we can emit the openEntityRecord call with the pkey\n const md = this.ProviderToUse;\n const e = md.EntityByName(entityName);\n if (!e) {\n console.warn(`Entity not found: ${entityName}`);\n return;\n }\n let shouldRunView = false;\n // now check each key in the keyToUse to see if it is a pkey\n for (const singleKey of keyToUse.KeyValuePairs) {\n const field = e.Fields.find(f => f.Name.trim().toLowerCase() === singleKey.FieldName.trim().toLowerCase());\n if (!field) {\n // if we get here this is a problem, the component has given us a non-matching field, this shouldn't ever happen\n // but if it doesn't log warning to console and exit\n console.warn(`Non-matching field found for key: ${JSON.stringify(keyToUse)}`);\n return;\n }\n else if (!field.IsPrimaryKey) {\n // if we get here that means we have a non-pkey so we'll want to do a lookup via a RunView\n // to get the actual pkey value\n shouldRunView = true;\n break;\n }\n }\n\n // if we get here and shouldRunView is true, we need to run a view using the info provided\n // by our contained component to get the pkey\n if (shouldRunView) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: entityName,\n ExtraFilter: keyToUse.ToWhereClause()\n })\n if (result && result.Success && result.Results.length > 0) {\n // we have a match, use the first row and update our keyToUse\n const kvPairs: KeyValuePair[] = [];\n e.PrimaryKeys.forEach(pk => {\n kvPairs.push(\n {\n FieldName: pk.Name,\n Value: result.Results[0][pk.Name]\n }\n )\n })\n keyToUse = CompositeKey.FromKeyValuePairs(kvPairs);\n }\n }\n\n this.openEntityRecord.emit({ entityName, key: keyToUse });\n }\n },\n NotifyEvent: async (eventName: string, args: BaseEventArgs) => {\n this.componentEvent.emit({ type: eventName, payload: args });\n }\n };\n }\n\n /**\n * Handle React component errors\n */\n private handleReactError(error: any, errorInfo?: any) {\n LogError(`React component error: ${error?.toString() || 'Unknown error'}`, errorInfo);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error?.toString() || 'Unknown error',\n errorInfo,\n source: 'react'\n }\n });\n }\n\n /**\n * Handle onSaveUserSettings from components.\n *\n * This implements the SavedUserSettings pattern: the component owns its single\n * settings object and hands us the full latest copy whenever it changes. We\n * (1) **merge** the payload over our in-memory snapshot so any future re-render\n * passes the latest values, (2) persist the merged snapshot per-user via\n * UserInfoEngine (debounced, auto-scoped) unless the host opted out, and\n * (3) still bubble the event up for any parent container that wants to observe\n * changes — carrying the merged snapshot, so observers and storage agree.\n *\n * Merge (not replace) makes the host resilient to a component passing only the\n * changed keys, and to the stale-prop case: we deliberately never re-render on\n * save, so the `savedUserSettings` prop a component spreads is frozen at mount\n * and would otherwise lose earlier same-session changes. Removing a key\n * requires explicit intent — set it to `null` (see applyUserSettingsUpdate).\n */\n private handleSaveUserSettings(newSettings: Record<string, any>) {\n // Keep our snapshot current WITHOUT going through the setter (which would\n // re-render). The component already holds the correct state — it's the one\n // that told us about the change — so re-rendering would only cause flicker.\n this._savedUserSettings = applyUserSettingsUpdate(this._savedUserSettings, newSettings);\n\n // Durably persist the latest settings for this user, scoped to this component.\n this.persistUserSettings(this._savedUserSettings);\n\n // Bubble the event up to parent containers (back-compat; no consumer required).\n this.userSettingsChanged.emit({\n settings: this._savedUserSettings,\n componentName: this.component?.name,\n timestamp: new Date()\n });\n }\n\n /**\n * Resolve the durable storage key for this component's per-user settings, or\n * null when persistence is disabled or no stable scope can be derived.\n */\n private getUserStateStorageKey(): string | null {\n if (!this.PersistUserSettings) {\n return null;\n }\n const scope = resolveUserStateScope(\n this.UserStateScope,\n this._component?.namespace,\n this._component?.name\n );\n return userStateStorageKey(scope);\n }\n\n /**\n * Seed `savedUserSettings` from durable per-user storage (UserInfoEngine),\n * merging stored values over any host-provided defaults (stored wins). Best\n * effort — any failure leaves the host-provided / empty settings in place.\n */\n private async seedUserSettingsFromStore(): Promise<void> {\n const key = this.getUserStateStorageKey();\n if (!key) {\n return;\n }\n try {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (!user) {\n return; // No user context — cannot scope settings to a user.\n }\n // Idempotent: a no-op when the engine is already loaded for this user.\n await UserInfoEngine.Instance.Config(false, user, provider);\n const stored = parseStoredUserSettings(UserInfoEngine.Instance.GetSetting(key));\n this._savedUserSettings = mergeUserSettings(this._savedUserSettings, stored);\n } catch (error) {\n if (this.enableLogging) {\n console.warn('MJReactComponent: failed to seed user settings from store', error);\n }\n }\n }\n\n /**\n * Persist the component's settings object for the current user (debounced,\n * cross-device). Best effort — failures are logged when logging is enabled and\n * never surfaced to the component.\n */\n private persistUserSettings(settings: Record<string, any> | string): void {\n const key = this.getUserStateStorageKey();\n if (!key) {\n return;\n }\n try {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (!user) {\n return;\n }\n // The component normally hands us an object, but guard against a caller\n // that already serialized it — double-stringifying would store a quoted\n // JSON string the seed path could not parse back into settings.\n const serialized = typeof settings === 'string' ? settings : JSON.stringify(settings);\n UserInfoEngine.Instance.SetSettingDebounced(key, serialized, user);\n } catch (error) {\n if (this.enableLogging) {\n console.warn('MJReactComponent: failed to persist user settings', error);\n }\n }\n }\n\n // =================================================================\n // Automatic Data Capture — intercept RunView/RunQuery for fallback\n // =================================================================\n\n /**\n * Wraps a ComponentUtilities object so that every RunView / RunViews / RunQuery\n * call transparently stores the result in `this.capturedData`. The wrapped\n * object is referentially distinct from the original and is safe to pass to\n * multiple renders (results accumulate until the component resets).\n */\n private wrapUtilitiesWithCapture(original: ComponentUtilities): ComponentUtilities {\n const self = this;\n const wrappedRv: SimpleRunView = {\n RunView: async (params: RunViewParams, contextUser?: unknown) => {\n const result = await original.rv.RunView(params, contextUser as undefined);\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params.EntityName ?? params.ExtraFilter ?? 'Unknown'),\n sourceType: 'view',\n params: params as unknown as Record<string, unknown>,\n rows: result.Results ?? [],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n return result;\n },\n RunViews: async (params: RunViewParams[], contextUser?: unknown) => {\n const results = await original.rv.RunViews(params, contextUser as undefined);\n results.forEach((result: RunViewResult, i: number) => {\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params[i]?.EntityName ?? `View ${i}`),\n sourceType: 'view',\n params: params[i] as unknown as Record<string, unknown>,\n rows: result.Results ?? [],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n });\n return results;\n }\n };\n\n const wrappedRq: SimpleRunQuery = {\n RunQuery: async (params: RunQueryParams, contextUser?: unknown) => {\n const result = await original.rq.RunQuery(params, contextUser as undefined);\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params.QueryID ?? params.QueryName ?? 'Query'),\n sourceType: 'query',\n params: params as unknown as Record<string, unknown>,\n rows: (result.Results ?? []) as Record<string, unknown>[],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n return result;\n }\n };\n\n return {\n ...original,\n rv: wrappedRv,\n rq: wrappedRq\n };\n }\n\n /**\n * Builds a DataSnapshot from captured RunView/RunQuery results.\n * Returns null if no data was captured.\n */\n private BuildCapturedDataSnapshot(): DataSnapshot | null {\n if (this.capturedData.length === 0) return null;\n\n const tables: DataTable[] = this.capturedData.map((captured, idx) => {\n const table = new DataTable();\n table.name = captured.sourceName || `Table ${idx + 1}`;\n table.source = captured.sourceType;\n table.rows = captured.rows;\n // Infer columns from the first row's keys\n if (captured.rows.length > 0) {\n const firstRow = captured.rows[0];\n table.columns = Object.keys(firstRow).map(key => {\n const col = new MJColumnDescriptor(key);\n col.displayName = key;\n const val = firstRow[key];\n if (typeof val === 'number') col.sqlBaseType = 'float';\n else if (val instanceof Date) col.sqlBaseType = 'datetime';\n else col.sqlBaseType = 'nvarchar';\n return col;\n });\n }\n table.metadata = {\n entityName: captured.sourceType === 'view' ? captured.sourceName : undefined,\n rowCount: captured.rows.length,\n totalAvailableRows: captured.totalRows,\n fetchedAt: captured.fetchedAt\n };\n return table;\n });\n\n return DataSnapshot.FromTables(tables, this.component?.title ?? this.component?.name);\n }\n\n /**\n * Clean up resources\n */\n private cleanup() {\n // Clean up all resources managed by resource manager\n resourceManager.cleanupComponent(this.componentId);\n \n // Clean up prop builder subscriptions\n if (this.currentCallbacks) {\n this.currentCallbacks = null;\n }\n \n // Unmount React root using managed unmount\n if (this.reactRootId) {\n // Force stop rendering flags\n this.isRendering = false;\n this.pendingRender = false;\n \n // This will handle waiting for render completion if needed\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Clear references\n this.compiledComponent = null;\n this.isInitialized = false;\n this.capturedData = [];\n\n // Trigger registry cleanup\n this.adapter.getRegistry().cleanup();\n }\n\n /**\n * Public method to refresh the component\n * @deprecated Components manage their own state and data now\n */\n refresh() {\n // Check if the component has registered a refresh method\n if (this.compiledComponent?.refresh) {\n this.compiledComponent.refresh();\n } else {\n // Fallback: trigger a re-render if needed\n this.renderComponent();\n }\n }\n\n /**\n * Public method to update state programmatically\n * @param path - State path to update\n * @param value - New value\n * @deprecated Components manage their own state now\n */\n updateState(path: string, value: any) {\n // Just emit the event, don't manage state here\n this.stateChange.emit({ path, value });\n }\n\n // =================================================================\n // Standard Component Methods - Strongly Typed\n // =================================================================\n \n /**\n * Gets the current data state of the component.\n * Tries the component's explicit implementation first, then falls back\n * to a DataSnapshot built from intercepted RunView/RunQuery results.\n */\n getCurrentDataState(): DataSnapshot | undefined {\n const explicit = this.compiledComponent?.getCurrentDataState?.();\n if (explicit && typeof explicit === 'object') return explicit;\n return this.BuildCapturedDataSnapshot() ?? undefined;\n }\n \n /**\n * Validates the current state of the component\n * @returns true if valid, false or validation errors otherwise\n */\n validate(): boolean | { valid: boolean; errors?: string[] } {\n return this.compiledComponent?.validate?.() || true;\n }\n \n /**\n * Checks if the component has unsaved changes\n * @returns true if dirty, false otherwise\n */\n isDirty(): boolean {\n return this.compiledComponent?.isDirty?.() || false;\n }\n \n /**\n * Resets the component to its initial state\n */\n reset(): void {\n this.compiledComponent?.reset?.();\n }\n \n /**\n * Scrolls to a specific element or position within the component\n * @param target - Element selector, element reference, or scroll options\n */\n scrollTo(target: string | HTMLElement | { top?: number; left?: number }): void {\n this.compiledComponent?.scrollTo?.(target);\n }\n \n /**\n * Sets focus to a specific element within the component\n * @param target - Element selector or element reference\n */\n focus(target?: string | HTMLElement): void {\n this.compiledComponent?.focus?.(target);\n }\n \n /**\n * Invokes a custom method on the component\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n * @returns The result of the method call, or undefined if method doesn't exist\n */\n invokeMethod(methodName: string, ...args: any[]): any {\n return this.compiledComponent?.invokeMethod?.(methodName, ...args);\n }\n \n /**\n * Checks if a method is available on the component\n * @param methodName - Name of the method to check\n * @returns true if the method exists\n */\n hasMethod(methodName: string): boolean {\n return this.compiledComponent?.hasMethod?.(methodName) || false;\n }\n \n /**\n * Print the component content\n * Uses component's print method if available, otherwise uses window.print()\n */\n print(): void {\n if (this.compiledComponent?.print) {\n this.compiledComponent.print();\n } else if (typeof window !== 'undefined' && window.print) {\n window.print();\n }\n }\n\n /**\n * Force clear component registries\n * Used by Component Studio for fresh loads\n * This is a static method that can be called without a component instance\n */\n public static forceClearRegistries(): void {\n // Clear React runtime's component registry service\n ComponentRegistryService.reset();\n\n // Clear any cached hierarchy registrar\n if (typeof window !== 'undefined' && (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__) {\n (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__ = null;\n }\n\n console.log('🧹 All component registries cleared for fresh load');\n }\n\n /**\n * Gets the current data state from the hosted React component.\n * Falls back to a DataSnapshot built from intercepted RunView/RunQuery results\n * when the component does not explicitly implement getCurrentDataState.\n */\n public GetCurrentDataState(): DataSnapshot | undefined {\n return this.getCurrentDataState();\n }\n\n /**\n * Applies a data state snapshot to the hosted React component.\n * Returns true if the snapshot was successfully applied, false if the\n * component does not support setDataState or the operation failed.\n */\n public SetDataState(snapshot: DataSnapshot): boolean {\n return this.compiledComponent?.setDataState?.(snapshot) ?? false;\n }\n\n}"]}
1
+ {"version":3,"file":"mj-react-component.component.js","sourceRoot":"","sources":["../../../src/lib/components/mj-react-component.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular component that hosts React components with proper memory management.\n * Provides a bridge between Angular and React ecosystems in MemberJunction applications.\n * @module @memberjunction/ng-react\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ComponentSpec, ComponentCallbacks, ComponentStyles, ComponentObject, BaseEventArgs } from '@memberjunction/interactive-component-types';\nimport { ReactBridgeService } from '../services/react-bridge.service';\nimport { AngularAdapterService } from '../services/angular-adapter.service';\nimport {\n createErrorBoundary,\n ComponentHierarchyRegistrar,\n resourceManager,\n reactRootManager,\n ResolvedComponents,\n SetupStyles,\n BuildStylesFromTheme,\n wrapWithLibraryThemeProviders,\n ComponentRegistryService,\n resolveUserStateScope,\n userStateStorageKey,\n parseStoredUserSettings,\n mergeUserSettings,\n applyUserSettingsUpdate\n} from '@memberjunction/react-runtime';\nimport { createRuntimeUtilities } from '../utilities/runtime-utilities';\nimport { LogError, CompositeKey, KeyValuePair, Metadata, RunView, RunViewParams, RunViewResult, RunQueryParams, RunQueryResult, DataSnapshot, DataTable, MJColumnDescriptor } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ComponentMetadataEngine, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ComponentUtilities, SimpleRunView, SimpleRunQuery } from '@memberjunction/interactive-component-types';\n\n/**\n * A captured RunView/RunQuery result with its original parameters.\n * Used by the automatic data capture system for components that don't\n * implement getCurrentDataState().\n */\ninterface CapturedDataResult {\n /** Entity name or query name */\n sourceName: string;\n /** 'view' or 'query' */\n sourceType: 'view' | 'query';\n /** Original RunView/RunQuery params */\n params: Record<string, unknown>;\n /** Returned rows */\n rows: Record<string, unknown>[];\n /** Total available rows (may differ from rows.length due to pagination) */\n totalRows: number;\n /** When the data was fetched */\n fetchedAt: Date;\n}\n\n/**\n * Event emitted by React components\n */\nexport interface ReactComponentEvent {\n type: string;\n payload: any;\n}\n\n/**\n * State change event emitted when component state updates\n */\nexport interface StateChangeEvent {\n path: string;\n value: any;\n}\n\n/**\n * User settings changed event emitted when component saves user preferences\n */\nexport interface UserSettingsChangedEvent {\n settings: Record<string, any>;\n componentName?: string;\n timestamp: Date;\n}\n\n/**\n * Angular component that hosts React components with proper memory management.\n * This component provides a bridge between Angular and React, allowing React components\n * to be used seamlessly within Angular applications.\n */\n@Component({\n standalone: false,\n selector: 'mj-react-component',\n template: `\n <div class=\"react-component-wrapper\">\n <div #container class=\"react-component-container\" [class.loading]=\"!isInitialized\"></div>\n @if (!isInitialized && !hasError) {\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"loading-text\">Loading component...</div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .react-component-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .react-component-container {\n width: 100%;\n height: 100%;\n transition: opacity 0.3s ease;\n }\n .react-component-container.loading {\n opacity: 0;\n }\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n }\n .loading-spinner {\n font-size: 48px;\n color: #5B4FE9;\n margin-bottom: 16px;\n }\n .loading-text {\n font-family: -apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: #64748B;\n margin-top: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJReactComponent extends BaseAngularComponent implements AfterViewInit, OnDestroy {\n private _component!: ComponentSpec;\n\n /**\n * The component specification to render.\n * When this changes after initialization, the component will be reinitialized\n * to load and render the new specification.\n */\n @Input()\n set component(value: ComponentSpec) {\n const previousComponent = this._component;\n this._component = value;\n\n // If already initialized and component spec changed, reinitialize\n if (this.isInitialized && value && previousComponent !== value) {\n // Check if it's actually a different component (not just same reference)\n const isDifferent = !previousComponent ||\n previousComponent.name !== value.name ||\n previousComponent.code !== value.code ||\n previousComponent.version !== value.version;\n\n if (isDifferent) {\n this.reinitializeComponent();\n }\n }\n }\n get component(): ComponentSpec {\n return this._component;\n }\n\n /**\n * Controls verbose logging for component lifecycle and operations.\n * Note: This does NOT control which React build (dev/prod) is loaded.\n * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.\n */\n @Input() enableLogging: boolean = false;\n @Input() useComponentManager: boolean = true; // NEW: Use unified ComponentManager by default\n \n // Auto-initialize utilities if not provided\n private _utilities: any;\n @Input()\n set utilities(value: any) {\n this._utilities = value;\n }\n get utilities(): any {\n // Lazy initialization - only create default utilities when needed\n if (!this._utilities) {\n const runtimeUtils = createRuntimeUtilities();\n this._utilities = runtimeUtils.buildUtilities(this.enableLogging);\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized utilities using createRuntimeUtilities()');\n }\n }\n return this._utilities;\n }\n \n // Auto-initialize styles if not provided\n private _styles?: Partial<ComponentStyles>;\n // Theme-bridge cache: the ComponentStyles derived from the live `--mj-*` theme,\n // memoized per theme key so we don't re-read getComputedStyle on every access.\n private _themeStyles?: ComponentStyles;\n private _themeStylesKey?: string;\n private themeObserver?: MutationObserver;\n @Input()\n set styles(value: Partial<ComponentStyles> | undefined) {\n this._styles = value;\n }\n get styles(): Partial<ComponentStyles> {\n // An explicitly-provided styles input always wins.\n if (this._styles) {\n return this._styles;\n }\n // Otherwise bridge the host's live MJ theme (--mj-* tokens) into ComponentStyles\n // so generated components inherit the active theme — including dark mode and\n // hover/active/focus state families — instead of the frozen defaults. Memoized\n // per theme key; invalidated by the MutationObserver on data-theme changes.\n const key = this.computeThemeKey();\n if (!this._themeStyles || this._themeStylesKey !== key) {\n this._themeStyles = BuildStylesFromTheme();\n this._themeStylesKey = key;\n if (this.enableLogging) {\n console.log(`MJReactComponent: Bridged styles from live theme (key=\"${key}\")`);\n }\n }\n return this._themeStyles;\n }\n\n /**\n * Identifies the current theme so bridged styles can be memoized and refreshed\n * when the user's mode (`data-theme`) or the org overlay (`data-theme-overlay`)\n * changes. Non-DOM environments return a constant key.\n */\n private computeThemeKey(): string {\n if (typeof document === 'undefined') {\n return 'no-dom';\n }\n const root = document.documentElement;\n return `${root.getAttribute('data-theme') || 'light'}|${root.getAttribute('data-theme-overlay') || ''}`;\n }\n\n /**\n * Watches the document root for theme changes (`data-theme` / `data-theme-overlay`)\n * and, when the theme flips, invalidates the bridged-styles cache and re-renders so\n * the live React component picks up the new theme. No-op when styles are supplied\n * explicitly or when there is no DOM.\n */\n private setupThemeObserver(): void {\n if (this._styles || typeof MutationObserver === 'undefined' || typeof document === 'undefined') {\n return;\n }\n this.themeObserver = new MutationObserver(() => {\n const key = this.computeThemeKey();\n if (key !== this._themeStylesKey) {\n this._themeStyles = undefined;\n this._themeStylesKey = undefined;\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n });\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'data-theme-overlay'],\n });\n }\n \n private _savedUserSettings: any = {};\n @Input()\n set savedUserSettings(value: any) {\n this._savedUserSettings = value || {};\n // Re-render if component is initialized\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get savedUserSettings(): any {\n return this._savedUserSettings;\n }\n\n /**\n * Optional explicit scope for per-user settings persistence. When omitted, the\n * scope defaults to `<namespace>/<name>` of the component spec. Settings are\n * stored per-user via `UserInfoEngine` under the key\n * `InteractiveComponents_UserState_Root/<scope>`. Provide an\n * explicit scope when a single component spec is rendered in multiple distinct\n * contexts that should NOT share preferences (e.g. the same form spec used for\n * different entities) — set it to something stable and unique per context.\n */\n @Input() UserStateScope?: string;\n\n /**\n * When `true` (default), the host transparently persists `savedUserSettings`\n * per-user, cross-device via `UserInfoEngine` — seeding the component from\n * storage on load and saving (debounced) on every `onSaveUserSettings` call,\n * auto-scoped per component. Set to `false` to opt out and own persistence\n * yourself by handling the `userSettingsChanged` output instead.\n */\n @Input() PersistUserSettings: boolean = true;\n\n /**\n * Host-supplied props spread into the React component's props alongside the\n * standard `utilities`, `callbacks`, `components`, `styles`, `libraries`, and\n * `savedUserSettings`. Used by hosts that need to push data context the React\n * component can't fetch itself — e.g. `InteractiveFormComponent` passing\n * `FormHostProps` (the current record snapshot, mode, permissions).\n *\n * Standard keys take precedence over caller-supplied keys to keep the\n * platform contract stable.\n */\n private _componentProps: object = {};\n @Input()\n set componentProps(value: object | undefined) {\n this._componentProps = value ?? {};\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get componentProps(): object {\n return this._componentProps;\n }\n\n @Output() stateChange = new EventEmitter<StateChangeEvent>();\n @Output() componentEvent = new EventEmitter<ReactComponentEvent>();\n @Output() refreshData = new EventEmitter<void>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; key: CompositeKey }>();\n @Output() userSettingsChanged = new EventEmitter<UserSettingsChangedEvent>();\n /** Emitted once after the component successfully loads and resolvedComponentSpec is populated. */\n @Output() initialized = new EventEmitter<void>();\n \n @ViewChild('container', { read: ElementRef, static: true }) container!: ElementRef<HTMLDivElement>;\n\n // ─── Automatic data capture ───\n // Stores RunView/RunQuery results for components that don't implement getCurrentDataState().\n // Cleared on component reinitialize. Used as fallback in GetCurrentDataState().\n private capturedData: CapturedDataResult[] = [];\n\n private reactRootId: string | null = null;\n private compiledComponent: ComponentObject | null = null;\n private loadedDependencies: Record<string, ComponentObject> = {};\n private destroyed$ = new Subject<void>();\n private currentCallbacks: ComponentCallbacks | null = null;\n isInitialized = false;\n private isRendering = false;\n private pendingRender = false;\n private isDestroying = false;\n private componentId: string;\n private componentVersion: string = ''; // Store the version for resolver\n hasError = false;\n \n /**\n * Public property containing the fully resolved component specification.\n * This includes all external code fetched from registries, allowing consumers\n * to inspect the complete resolved specification including dependencies.\n * Only populated after successful component initialization.\n */\n public resolvedComponentSpec: ComponentSpec | null = null;\n\n constructor(\n private reactBridge: ReactBridgeService,\n private adapter: AngularAdapterService,\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n // Generate unique component ID for resource tracking\n this.componentId = `mj-react-component-${Date.now()}-${Math.random()}`;\n }\n\n async ngAfterViewInit() {\n // Try to get registry size safely\n let registrySize = 'N/A';\n try {\n if (this.adapter.isInitialized()) {\n registrySize = this.adapter.getRegistry().size().toString();\n } else {\n registrySize = 'Not initialized yet';\n }\n } catch (e) {\n registrySize = 'Not available';\n }\n \n console.log(`🎬 [ngAfterViewInit] Starting component initialization:`, {\n componentId: this.componentId,\n componentName: this.component?.name,\n timestamp: new Date().toISOString(),\n registrySize: registrySize\n });\n \n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n // Refresh bridged theme styles when the user's mode / org overlay changes.\n this.setupThemeObserver();\n await this.initializeComponent();\n }\n\n ngOnDestroy() {\n // Set destroying flag immediately\n this.isDestroying = true;\n\n // Cancel any pending renders\n this.pendingRender = false;\n\n this.themeObserver?.disconnect();\n this.themeObserver = undefined;\n\n this.destroyed$.next();\n this.destroyed$.complete();\n this.cleanup();\n }\n\n /**\n * Reinitialize the component when the input spec changes.\n * Cleans up the current component and initializes with the new spec.\n */\n private async reinitializeComponent() {\n // Don't reinitialize if we're being destroyed\n if (this.isDestroying) {\n return;\n }\n\n // Clear cached state from previous component\n this.compiledComponent = null;\n this.resolvedComponentSpec = null;\n this.loadedDependencies = {};\n this.componentVersion = '';\n this.hasError = false;\n this.isInitialized = false;\n this.capturedData = [];\n\n // Unmount existing React root if present\n if (this.reactRootId) {\n this.isRendering = false;\n this.pendingRender = false;\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n\n // Initialize with the new component spec\n await this.initializeComponent();\n }\n\n /**\n * Initialize the React component\n */\n private async initializeComponent() {\n try {\n // Ensure React is loaded\n await this.reactBridge.getReactContext();\n\n // Wait for React to be fully ready (handles first-load delay)\n await this.reactBridge.waitForReactReady();\n\n // NEW: Use ComponentManager if enabled (default: true)\n if (this.useComponentManager) {\n console.log(`🎯 [initializeComponent] Using NEW ComponentManager approach`);\n await this.loadComponentWithManager();\n \n // Component is already compiled and stored in this.compiledComponent\n // No need to fetch from registry - it's already set\n } else {\n console.log(`📦 [initializeComponent] Using legacy approach (will be deprecated)`);\n // Register component hierarchy (this compiles and registers all components including from registries)\n await this.registerComponentHierarchy();\n \n // The resolved spec should now be available from the registration result\n // No need to fetch again\n \n // Get the already-registered component from the registry\n const registry = this.adapter.getRegistry();\n \n console.log(`🔍 [initializeComponent] Looking for component in registry:`, {\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: this.componentVersion\n });\n \n // Let's also check what's actually in the registry\n // Note: ComponentRegistry doesn't have a list() method, so we'll skip this for now\n \n const componentWrapper = registry.get(\n this.component.name, \n this.component.namespace || 'Global', \n this.componentVersion\n );\n \n console.log(`🔍 [initializeComponent] Registry.get result:`, {\n found: !!componentWrapper,\n type: componentWrapper ? typeof componentWrapper : 'undefined',\n hasComponent: componentWrapper ? !!componentWrapper.component : false\n });\n \n if (!componentWrapper) {\n const source = this.component.registry ? `external registry ${this.component.registry}` : 'local registry';\n console.error(`❌ [initializeComponent] Component not found! Details:`, {\n searchedName: this.component.name,\n searchedNamespace: this.component.namespace || 'Global',\n searchedVersion: this.componentVersion,\n source: source\n });\n throw new Error(`Component ${this.component.name} was not found in registry after registration from ${source}`);\n }\n \n // The registry now stores ComponentObjects directly\n // Validate it has the expected structure\n if (!componentWrapper || typeof componentWrapper !== 'object') {\n throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);\n }\n \n if (!componentWrapper.component) {\n throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);\n }\n \n // Now that we use a regular HOC wrapper, components should always be functions\n if (typeof componentWrapper.component !== 'function') {\n throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);\n }\n \n this.compiledComponent = componentWrapper;\n } // End of else block for legacy approach\n \n // Create managed React root\n const reactContext = this.reactBridge.getCurrentContext();\n if (!reactContext) {\n throw new Error('React context not available');\n }\n \n this.reactRootId = reactRootManager.createRoot(\n this.container.nativeElement,\n (container: HTMLElement) => reactContext.ReactDOM.createRoot(container),\n this.componentId\n );\n\n // Seed savedUserSettings from durable per-user storage before the first\n // render so the component mounts with the user's persisted preferences.\n await this.seedUserSettingsFromStore();\n\n // Initial render\n this.renderComponent();\n this.isInitialized = true;\n\n // Trigger change detection since we're using OnPush\n this.cdr.detectChanges();\n\n // Notify parent that the component has successfully initialized and\n // resolvedComponentSpec is now populated with the full spec from the registry\n this.initialized.emit();\n\n } catch (error) {\n this.hasError = true;\n LogError(`Failed to initialize React component: ${error}`);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error instanceof Error ? error.message : String(error),\n source: 'initialization'\n }\n });\n // Trigger change detection to show error state\n this.cdr.detectChanges();\n }\n }\n \n\n /**\n * Generate a hash from component code for versioning\n * Uses a simple hash function that's fast and sufficient for version differentiation\n */\n private generateComponentHash(spec: ComponentSpec): string {\n // Collect all code from the component hierarchy\n const codeStrings: string[] = [];\n \n const collectCode = (s: ComponentSpec) => {\n if (s.code) {\n codeStrings.push(s.code);\n }\n if (s.dependencies) {\n for (const dep of s.dependencies) {\n collectCode(dep);\n }\n }\n };\n \n collectCode(spec);\n \n // Generate hash from concatenated code\n const fullCode = codeStrings.join('|');\n let hash = 0;\n for (let i = 0; i < fullCode.length; i++) {\n const char = fullCode.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Convert to hex string and take first 8 characters for readability\n const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);\n return `v${hexHash}`;\n }\n\n /**\n * Resolve components using the runtime's resolver\n */\n private async resolveComponentsWithVersion(spec: ComponentSpec, version: string, namespace: string = 'Global'): Promise<ResolvedComponents> {\n const resolver = this.adapter.getResolver();\n \n // Debug: Log what dependencies we're trying to resolve\n if (this.enableLogging) {\n console.log(`Resolving components for ${spec.name}. Dependencies:`, spec.dependencies);\n }\n \n // Use the runtime's resolver which now handles registry-based components\n const resolved = await resolver.resolveComponents(\n spec, \n namespace,\n this.ProviderToUse.CurrentUser // Pass current user context for database operations\n );\n \n if (this.enableLogging) {\n console.log(`Resolved ${Object.keys(resolved).length} components for version ${version}:`, Object.keys(resolved));\n }\n return resolved;\n }\n\n\n /**\n * NEW: Load component using unified ComponentManager - MUCH SIMPLER!\n */\n private async loadComponentWithManager() {\n try {\n const manager = this.adapter.getComponentManager();\n \n console.log(`🚀 [ComponentManager] Loading component hierarchy: ${this.component.name}`);\n \n // Load the entire hierarchy with one simple call\n const result = await manager.loadHierarchy(this.component, {\n contextUser: this.ProviderToUse.CurrentUser,\n defaultNamespace: 'Global',\n defaultVersion: this.component.version || this.generateComponentHash(this.component),\n returnType: 'both'\n });\n \n if (!result.success) {\n const errorMessages = result.errors.map(e => `${e.componentName}: ${e.message}`).join(', ');\n console.error(`❌ [ComponentManager] Failed to load hierarchy:`, errorMessages);\n throw new Error(`Component loading failed: ${errorMessages}`);\n }\n \n // Store the results (handle undefined values)\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n this.compiledComponent = result.rootComponent || null;\n this.componentVersion = result.resolvedSpec?.version || this.component.version || 'latest';\n \n // IMPORTANT: Store the loaded dependencies for use in renderComponent\n this.loadedDependencies = result.components || {};\n \n console.log(`✅ [ComponentManager] Successfully loaded hierarchy:`, {\n rootComponent: result.resolvedSpec?.name,\n loadedCount: result.loadedComponents.length,\n dependencies: Object.keys(this.loadedDependencies),\n stats: result.stats\n });\n \n // Component is ready to render\n return true;\n \n } catch (error) {\n console.error(`❌ [ComponentManager] Error loading component:`, error);\n throw error;\n }\n }\n\n /**\n * Register all components in the hierarchy\n * @deprecated Use loadComponentWithManager() instead\n */\n private async registerComponentHierarchy() {\n // Use semantic version from spec or generate hash-based version for uniqueness\n const version = this.component.version || this.generateComponentHash(this.component);\n this.componentVersion = version; // Store for use in resolver\n \n console.log(`🔍 [registerComponentHierarchy] Starting registration for ${this.component.name}@${version}`, {\n location: this.component.location,\n registry: this.component.registry,\n namespace: this.component.namespace,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Check if already registered to avoid duplication\n const registry = this.adapter.getRegistry();\n const checkNamespace = this.component.namespace || 'Global';\n \n console.log(`🔍 [registerComponentHierarchy] Checking registry for existing component:`, {\n name: this.component.name,\n namespace: checkNamespace,\n version: version,\n registrySize: registry.size(),\n registryId: registry.registryId || 'unknown'\n });\n \n // Log registry state for debugging\n console.log(`📦 [registerComponentHierarchy] Registry state:`, {\n totalSize: registry.size(),\n registryInstance: registry.registryId || 'unknown'\n });\n \n const existingComponent = registry.get(this.component.name, checkNamespace, version);\n \n if (existingComponent) {\n console.log(`⚠️ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered!`, {\n existingType: typeof existingComponent,\n hasComponent: !!(existingComponent as any).component,\n registrationTime: (existingComponent as any).registeredAt || 'unknown',\n runtimeContextLibraries: Object.keys(this.adapter.getRuntimeContext().libraries || {})\n });\n \n // For registry components, we need to check the resolved spec's libraries, not the input spec\n // The input spec from Angular doesn't have library information for registry components\n if (this.component.location === 'registry' && this.component.registry) {\n console.log(`📋 [registerComponentHierarchy] Component is from registry, need to fetch full spec to check libraries`);\n // Continue to fetch the full spec below - don't return early\n } else {\n // For local components, check using the input spec\n const requiredLibraries = this.component.libraries || [];\n const runtimeLibraries = this.adapter.getRuntimeContext().libraries || {};\n const missingLibraries = requiredLibraries.filter(lib => !runtimeLibraries[lib.globalVariable]);\n \n if (missingLibraries.length > 0) {\n console.warn(`⚠️ [registerComponentHierarchy] Component registered but libraries missing:`, {\n required: requiredLibraries.map(l => l.globalVariable),\n loaded: Object.keys(runtimeLibraries),\n missing: missingLibraries.map(l => l.globalVariable)\n });\n // Don't return early - continue to load libraries\n } else {\n console.log(`✅ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered with all libraries, skipping`);\n return;\n }\n }\n } else {\n console.log(`🆕 [registerComponentHierarchy] Component not found in registry, proceeding with registration`);\n }\n \n // Initialize metadata engine\n await ComponentMetadataEngine.Instance.Config(false, this.ProviderToUse.CurrentUser);\n \n // Use the runtime's hierarchy registrar\n const registrar = new ComponentHierarchyRegistrar(\n this.adapter.getCompiler(),\n this.adapter.getRegistry(),\n this.adapter.getRuntimeContext()\n );\n \n console.log(`📦 [registerComponentHierarchy] Calling registrar.registerHierarchy for ${this.component.name}`, {\n hasStyles: !!this.styles,\n namespace: this.component.namespace || 'Global',\n version: version,\n libraryCount: ComponentMetadataEngine.Instance.ComponentLibraries?.length || 0,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Register with proper configuration\n // Pass the partial spec - the React runtime will handle fetching from registries\n const result = await registrar.registerHierarchy(\n this.component, // Pass the original spec, not fetched\n {\n styles: this.styles as ComponentStyles,\n namespace: this.component.namespace || 'Global',\n version: version,\n allowOverride: false, // Each version is unique\n allLibraries: ComponentMetadataEngine.Instance.ComponentLibraries,\n debug: true,\n contextUser: this.ProviderToUse.CurrentUser\n }\n );\n \n if (!result.success) {\n const errors = result.errors.map(e => e.error).join(', ');\n console.error(`❌ [registerComponentHierarchy] Registration failed:`, errors);\n throw new Error(`Component registration failed: ${errors}`);\n }\n \n // Store the resolved spec from the registration result\n if (result.resolvedSpec) {\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n console.log(`📋 [registerComponentHierarchy] Received resolved spec from runtime:`, {\n name: result.resolvedSpec.name,\n hasCode: !!result.resolvedSpec.code,\n libraryCount: result.resolvedSpec.libraries?.length || 0,\n dependencyCount: result.resolvedSpec.dependencies?.length || 0\n });\n }\n \n console.log(`✅ [registerComponentHierarchy] Successfully registered ${result.registeredComponents.length} components:`, result.registeredComponents);\n \n // Verify the component is actually in the registry\n const verifyComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);\n console.log(`🔍 [registerComponentHierarchy] Verification - component in registry after registration:`, {\n found: !!verifyComponent,\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: version,\n componentType: verifyComponent ? typeof verifyComponent : 'not found'\n });\n }\n\n /**\n * Post-process resolved spec to ensure all components show their true registry source.\n * This enriches the spec for UI display purposes to show where components actually came from.\n * Applied to all resolved specs so any consumer of this wrapper benefits.\n */\n private enrichSpecWithRegistryInfo(spec: ComponentSpec | null): ComponentSpec | null {\n if (!spec || !this.component) return spec;\n \n // Create a deep copy to avoid mutating the original\n const enrichedSpec = JSON.parse(JSON.stringify(spec));\n \n // Recursive function to process spec and all dependencies\n // Takes the original spec at the same level to find registry info\n const processSpec = (currentSpec: ComponentSpec, originalSpec: ComponentSpec) => {\n // If this component has code but shows location as 'embedded', \n // check the original spec to see where it came from\n if (currentSpec.code && currentSpec.location === 'embedded' && currentSpec.name) {\n // Try to find this component in the original spec at the same level\n // First check if the original spec itself matches by name\n if (originalSpec.name === currentSpec.name) {\n // Use the original's registry info if it had any\n if (originalSpec.location === 'registry' || originalSpec.registry) {\n currentSpec.location = 'registry';\n if (originalSpec.registry) {\n currentSpec.registry = originalSpec.registry;\n }\n if (originalSpec.namespace) {\n currentSpec.namespace = originalSpec.namespace;\n }\n }\n }\n \n // Also check in original's dependencies for a match\n if (originalSpec.dependencies) {\n const originalDep = originalSpec.dependencies.find(d => d.name === currentSpec.name);\n if (originalDep && (originalDep.location === 'registry' || originalDep.registry)) {\n currentSpec.location = 'registry';\n if (originalDep.registry) {\n currentSpec.registry = originalDep.registry;\n }\n if (originalDep.namespace) {\n currentSpec.namespace = originalDep.namespace;\n }\n }\n }\n }\n \n // Process all dependencies recursively\n if (currentSpec.dependencies && Array.isArray(currentSpec.dependencies)) {\n currentSpec.dependencies.forEach((dep, index) => {\n // Find the corresponding original dependency by name or use the one at same index\n let originalDep = originalSpec.dependencies?.find(d => d.name === dep.name);\n if (!originalDep && originalSpec.dependencies && index < originalSpec.dependencies.length) {\n originalDep = originalSpec.dependencies[index];\n }\n if (originalDep) {\n processSpec(dep, originalDep);\n }\n });\n }\n };\n \n processSpec(enrichedSpec, this.component);\n return enrichedSpec;\n }\n\n /**\n * Render the React component\n */\n private async renderComponent() {\n // Don't render if component is being destroyed\n if (this.isDestroying) {\n return;\n }\n \n if (!this.compiledComponent || !this.reactRootId) {\n return;\n }\n\n // Prevent concurrent renders\n if (this.isRendering) {\n this.pendingRender = true;\n return;\n }\n\n const context = this.reactBridge.getCurrentContext();\n if (!context) {\n return;\n }\n\n this.isRendering = true;\n const { React } = context;\n \n // Resolve components with the correct version using runtime's resolver\n // SKIP this if using ComponentManager - components are already loaded!\n let components = {};\n if (!this.useComponentManager) {\n components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);\n } else {\n // Use the dependencies that were already loaded and unwrapped by ComponentManager\n components = this.loadedDependencies;\n console.log(`🎯 [renderComponent] Using dependencies from ComponentManager:`, Object.keys(components));\n }\n \n // Create callbacks once per component instance\n if (!this.currentCallbacks) {\n this.currentCallbacks = this.createCallbacks();\n }\n \n // Get libraries from runtime context\n const runtimeContext = this.adapter.getRuntimeContext();\n const libraries = runtimeContext.libraries || {};\n \n // Build props — wrap utilities with data capture for fallback snapshot support.\n // Host-supplied componentProps spread first so platform-provided keys\n // (utilities, callbacks, components, styles, libraries, savedUserSettings,\n // onSaveUserSettings) always win — the contract stays stable regardless of\n // what a host passes in.\n const wrappedUtilities = this.wrapUtilitiesWithCapture(this.utilities);\n const props = {\n ...this._componentProps,\n utilities: wrappedUtilities,\n callbacks: this.currentCallbacks,\n components,\n styles: this.styles as any,\n libraries, // Pass the loaded libraries to components\n savedUserSettings: this._savedUserSettings,\n onSaveUserSettings: this.handleSaveUserSettings.bind(this)\n };\n\n // Validate component before creating element\n if (!this.compiledComponent.component) {\n LogError(`Component is undefined for ${this.component.name} during render`);\n return;\n }\n \n // Components should be functions after HOC wrapping\n if (typeof this.compiledComponent.component !== 'function') {\n LogError(`Component is not a function for ${this.component.name}: ${typeof this.compiledComponent.component}`);\n return;\n }\n\n // Create error boundary\n const ErrorBoundary = createErrorBoundary(React, {\n onError: this.handleReactError.bind(this),\n logErrors: true,\n recovery: 'retry'\n });\n\n // Create element with error boundary. Auto-theme component libraries (antd) from\n // the live MJ theme by wrapping the mounted tree in their theme provider — antd\n // components don't read styles.* on their own and would otherwise render in their\n // built-in light theme even in dark mode. One wrap themes every antd component in\n // the subtree; no-op when antd isn't loaded.\n const themedComponent = wrapWithLibraryThemeProviders(\n React,\n React.createElement(this.compiledComponent.component, props),\n libraries,\n this.styles as ComponentStyles\n );\n const element = React.createElement(\n ErrorBoundary,\n null,\n themedComponent\n );\n\n // Render with timeout protection using resource manager\n const timeoutId = resourceManager.setTimeout(\n this.componentId,\n () => {\n // Check if still rendering and not destroyed\n if (this.isRendering && !this.isDestroying) {\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: 'Component render timeout - possible infinite loop detected',\n source: 'render'\n }\n });\n }\n },\n 5000,\n { purpose: 'render-timeout-protection' }\n );\n\n // Use managed React root for rendering\n reactRootManager.render(\n this.reactRootId,\n element,\n () => {\n // Clear the timeout as render completed\n resourceManager.clearTimeout(this.componentId, timeoutId);\n \n // Don't update state if component is destroyed\n if (this.isDestroying) {\n return;\n }\n \n this.isRendering = false;\n \n // If there was a pending render request, execute it now\n if (this.pendingRender) {\n this.pendingRender = false;\n this.renderComponent();\n }\n }\n );\n }\n\n /**\n * Create callbacks for the React component\n */\n private createCallbacks(): ComponentCallbacks {\n return {\n RegisterMethod: (_methodName: string, _handler: any) => {\n // The component compiler wrapper will handle this internally\n // This is just a placeholder to satisfy the interface\n // The actual registration happens in the wrapper component\n },\n CreateSimpleNotification: (message: string, style: \"none\" | \"success\" | \"error\" | \"warning\" | \"info\", hideAfter?: number) => {\n // Use the MJ notification service to display the notification\n const notificationStyle = style as \"none\" | \"success\" | \"error\" | \"warning\" | \"info\" | undefined;\n this.notificationService.CreateSimpleNotification(\n message, \n style, \n hideAfter\n );\n },\n OpenEntityRecord: async (entityName: string, key: CompositeKey) => {\n let keyToUse: CompositeKey | null = null;\n if (key instanceof Array) {\n keyToUse = CompositeKey.FromKeyValuePairs(key);\n }\n else if (typeof key === 'object' && !!key.GetValueByFieldName) {\n keyToUse = key as CompositeKey;\n }\n else if (typeof key === 'object') {\n //} && !!key.FieldName && !!key.Value) {\n // possible that have an object that is a simple key/value pair with\n // FieldName and value properties\n const keyAny = key as any;\n if (keyAny.FieldName && keyAny.Value) {\n keyToUse = CompositeKey.FromKeyValuePairs([keyAny as KeyValuePair]);\n }\n }\n if (keyToUse) {\n // now in some cases we have key/value pairs that the component we are hosting\n // use, but are not the pkey, so if that is the case, we'll run a quick view to try\n // and get the pkey so that we can emit the openEntityRecord call with the pkey\n const md = this.ProviderToUse;\n const e = md.EntityByName(entityName);\n if (!e) {\n console.warn(`Entity not found: ${entityName}`);\n return;\n }\n let shouldRunView = false;\n // now check each key in the keyToUse to see if it is a pkey\n for (const singleKey of keyToUse.KeyValuePairs) {\n const field = e.Fields.find(f => f.Name.trim().toLowerCase() === singleKey.FieldName.trim().toLowerCase());\n if (!field) {\n // if we get here this is a problem, the component has given us a non-matching field, this shouldn't ever happen\n // but if it doesn't log warning to console and exit\n console.warn(`Non-matching field found for key: ${JSON.stringify(keyToUse)}`);\n return;\n }\n else if (!field.IsPrimaryKey) {\n // if we get here that means we have a non-pkey so we'll want to do a lookup via a RunView\n // to get the actual pkey value\n shouldRunView = true;\n break;\n }\n }\n\n // if we get here and shouldRunView is true, we need to run a view using the info provided\n // by our contained component to get the pkey\n if (shouldRunView) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: entityName,\n ExtraFilter: keyToUse.ToWhereClause()\n })\n if (result && result.Success && result.Results.length > 0) {\n // we have a match, use the first row and update our keyToUse\n const kvPairs: KeyValuePair[] = [];\n e.PrimaryKeys.forEach(pk => {\n kvPairs.push(\n {\n FieldName: pk.Name,\n Value: result.Results[0][pk.Name]\n }\n )\n })\n keyToUse = CompositeKey.FromKeyValuePairs(kvPairs);\n }\n }\n\n this.openEntityRecord.emit({ entityName, key: keyToUse });\n }\n },\n NotifyEvent: async (eventName: string, args: BaseEventArgs) => {\n this.componentEvent.emit({ type: eventName, payload: args });\n }\n };\n }\n\n /**\n * Handle React component errors\n */\n private handleReactError(error: any, errorInfo?: any) {\n LogError(`React component error: ${error?.toString() || 'Unknown error'}`, errorInfo);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error?.toString() || 'Unknown error',\n errorInfo,\n source: 'react'\n }\n });\n }\n\n /**\n * Handle onSaveUserSettings from components.\n *\n * This implements the SavedUserSettings pattern: the component owns its single\n * settings object and hands us the full latest copy whenever it changes. We\n * (1) **merge** the payload over our in-memory snapshot so any future re-render\n * passes the latest values, (2) persist the merged snapshot per-user via\n * UserInfoEngine (debounced, auto-scoped) unless the host opted out, and\n * (3) still bubble the event up for any parent container that wants to observe\n * changes — carrying the merged snapshot, so observers and storage agree.\n *\n * Merge (not replace) makes the host resilient to a component passing only the\n * changed keys, and to the stale-prop case: we deliberately never re-render on\n * save, so the `savedUserSettings` prop a component spreads is frozen at mount\n * and would otherwise lose earlier same-session changes. Removing a key\n * requires explicit intent — set it to `null` (see applyUserSettingsUpdate).\n */\n private handleSaveUserSettings(newSettings: Record<string, any>) {\n // Keep our snapshot current WITHOUT going through the setter (which would\n // re-render). The component already holds the correct state — it's the one\n // that told us about the change — so re-rendering would only cause flicker.\n this._savedUserSettings = applyUserSettingsUpdate(this._savedUserSettings, newSettings);\n\n // Durably persist the latest settings for this user, scoped to this component.\n this.persistUserSettings(this._savedUserSettings);\n\n // Bubble the event up to parent containers (back-compat; no consumer required).\n this.userSettingsChanged.emit({\n settings: this._savedUserSettings,\n componentName: this.component?.name,\n timestamp: new Date()\n });\n }\n\n /**\n * Resolve the durable storage key for this component's per-user settings, or\n * null when persistence is disabled or no stable scope can be derived.\n */\n private getUserStateStorageKey(): string | null {\n if (!this.PersistUserSettings) {\n return null;\n }\n const scope = resolveUserStateScope(\n this.UserStateScope,\n this._component?.namespace,\n this._component?.name\n );\n return userStateStorageKey(scope);\n }\n\n /**\n * Seed `savedUserSettings` from durable per-user storage (UserInfoEngine),\n * merging stored values over any host-provided defaults (stored wins). Best\n * effort — any failure leaves the host-provided / empty settings in place.\n */\n private async seedUserSettingsFromStore(): Promise<void> {\n const key = this.getUserStateStorageKey();\n if (!key) {\n return;\n }\n try {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (!user) {\n return; // No user context — cannot scope settings to a user.\n }\n // Idempotent: a no-op when the engine is already loaded for this user.\n await UserInfoEngine.Instance.Config(false, user, provider);\n const stored = parseStoredUserSettings(UserInfoEngine.Instance.GetSetting(key));\n this._savedUserSettings = mergeUserSettings(this._savedUserSettings, stored);\n } catch (error) {\n if (this.enableLogging) {\n console.warn('MJReactComponent: failed to seed user settings from store', error);\n }\n }\n }\n\n /**\n * Persist the component's settings object for the current user (debounced,\n * cross-device). Best effort — failures are logged when logging is enabled and\n * never surfaced to the component.\n */\n private persistUserSettings(settings: Record<string, any> | string): void {\n const key = this.getUserStateStorageKey();\n if (!key) {\n return;\n }\n try {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (!user) {\n return;\n }\n // The component normally hands us an object, but guard against a caller\n // that already serialized it — double-stringifying would store a quoted\n // JSON string the seed path could not parse back into settings.\n const serialized = typeof settings === 'string' ? settings : JSON.stringify(settings);\n UserInfoEngine.Instance.SetSettingDebounced(key, serialized, user);\n } catch (error) {\n if (this.enableLogging) {\n console.warn('MJReactComponent: failed to persist user settings', error);\n }\n }\n }\n\n // =================================================================\n // Automatic Data Capture — intercept RunView/RunQuery for fallback\n // =================================================================\n\n /**\n * Wraps a ComponentUtilities object so that every RunView / RunViews / RunQuery\n * call transparently stores the result in `this.capturedData`. The wrapped\n * object is referentially distinct from the original and is safe to pass to\n * multiple renders (results accumulate until the component resets).\n */\n private wrapUtilitiesWithCapture(original: ComponentUtilities): ComponentUtilities {\n const self = this;\n const wrappedRv: SimpleRunView = {\n RunView: async (params: RunViewParams, contextUser?: unknown) => {\n const result = await original.rv.RunView(params, contextUser as undefined);\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params.EntityName ?? params.ExtraFilter ?? 'Unknown'),\n sourceType: 'view',\n params: params as unknown as Record<string, unknown>,\n rows: result.Results ?? [],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n return result;\n },\n RunViews: async (params: RunViewParams[], contextUser?: unknown) => {\n const results = await original.rv.RunViews(params, contextUser as undefined);\n results.forEach((result: RunViewResult, i: number) => {\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params[i]?.EntityName ?? `View ${i}`),\n sourceType: 'view',\n params: params[i] as unknown as Record<string, unknown>,\n rows: result.Results ?? [],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n });\n return results;\n }\n };\n\n const wrappedRq: SimpleRunQuery = {\n RunQuery: async (params: RunQueryParams, contextUser?: unknown) => {\n const result = await original.rq.RunQuery(params, contextUser as undefined);\n if (result?.Success) {\n self.capturedData.push({\n sourceName: String(params.QueryID ?? params.QueryName ?? 'Query'),\n sourceType: 'query',\n params: params as unknown as Record<string, unknown>,\n rows: (result.Results ?? []) as Record<string, unknown>[],\n totalRows: result.TotalRowCount ?? result.Results?.length ?? 0,\n fetchedAt: new Date()\n });\n }\n return result;\n }\n };\n\n return {\n ...original,\n rv: wrappedRv,\n rq: wrappedRq\n };\n }\n\n /**\n * Builds a DataSnapshot from captured RunView/RunQuery results.\n * Returns null if no data was captured.\n */\n private BuildCapturedDataSnapshot(): DataSnapshot | null {\n if (this.capturedData.length === 0) return null;\n\n const tables: DataTable[] = this.capturedData.map((captured, idx) => {\n const table = new DataTable();\n table.name = captured.sourceName || `Table ${idx + 1}`;\n table.source = captured.sourceType;\n table.rows = captured.rows;\n // Infer columns from the first row's keys\n if (captured.rows.length > 0) {\n const firstRow = captured.rows[0];\n table.columns = Object.keys(firstRow).map(key => {\n const col = new MJColumnDescriptor(key);\n col.displayName = key;\n const val = firstRow[key];\n if (typeof val === 'number') col.sqlBaseType = 'float';\n else if (val instanceof Date) col.sqlBaseType = 'datetime';\n else col.sqlBaseType = 'nvarchar';\n return col;\n });\n }\n table.metadata = {\n entityName: captured.sourceType === 'view' ? captured.sourceName : undefined,\n rowCount: captured.rows.length,\n totalAvailableRows: captured.totalRows,\n fetchedAt: captured.fetchedAt\n };\n return table;\n });\n\n return DataSnapshot.FromTables(tables, this.component?.title ?? this.component?.name);\n }\n\n /**\n * Clean up resources\n */\n private cleanup() {\n // Clean up all resources managed by resource manager\n resourceManager.cleanupComponent(this.componentId);\n \n // Clean up prop builder subscriptions\n if (this.currentCallbacks) {\n this.currentCallbacks = null;\n }\n \n // Unmount React root using managed unmount\n if (this.reactRootId) {\n // Force stop rendering flags\n this.isRendering = false;\n this.pendingRender = false;\n \n // This will handle waiting for render completion if needed\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Clear references\n this.compiledComponent = null;\n this.isInitialized = false;\n this.capturedData = [];\n\n // Trigger registry cleanup\n this.adapter.getRegistry().cleanup();\n }\n\n /**\n * Public method to refresh the component\n * @deprecated Components manage their own state and data now\n */\n refresh() {\n // Check if the component has registered a refresh method\n if (this.compiledComponent?.refresh) {\n this.compiledComponent.refresh();\n } else {\n // Fallback: trigger a re-render if needed\n this.renderComponent();\n }\n }\n\n /**\n * Public method to update state programmatically\n * @param path - State path to update\n * @param value - New value\n * @deprecated Components manage their own state now\n */\n updateState(path: string, value: any) {\n // Just emit the event, don't manage state here\n this.stateChange.emit({ path, value });\n }\n\n // =================================================================\n // Standard Component Methods - Strongly Typed\n // =================================================================\n \n /**\n * Gets the current data state of the component.\n * Tries the component's explicit implementation first, then falls back\n * to a DataSnapshot built from intercepted RunView/RunQuery results.\n */\n getCurrentDataState(): DataSnapshot | undefined {\n const explicit = this.compiledComponent?.getCurrentDataState?.();\n if (explicit && typeof explicit === 'object') return explicit;\n return this.BuildCapturedDataSnapshot() ?? undefined;\n }\n \n /**\n * Validates the current state of the component\n * @returns true if valid, false or validation errors otherwise\n */\n validate(): boolean | { valid: boolean; errors?: string[] } {\n return this.compiledComponent?.validate?.() || true;\n }\n \n /**\n * Checks if the component has unsaved changes\n * @returns true if dirty, false otherwise\n */\n isDirty(): boolean {\n return this.compiledComponent?.isDirty?.() || false;\n }\n \n /**\n * Resets the component to its initial state\n */\n reset(): void {\n this.compiledComponent?.reset?.();\n }\n \n /**\n * Scrolls to a specific element or position within the component\n * @param target - Element selector, element reference, or scroll options\n */\n scrollTo(target: string | HTMLElement | { top?: number; left?: number }): void {\n this.compiledComponent?.scrollTo?.(target);\n }\n \n /**\n * Sets focus to a specific element within the component\n * @param target - Element selector or element reference\n */\n focus(target?: string | HTMLElement): void {\n this.compiledComponent?.focus?.(target);\n }\n \n /**\n * Invokes a custom method on the component\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n * @returns The result of the method call, or undefined if method doesn't exist\n */\n invokeMethod(methodName: string, ...args: any[]): any {\n return this.compiledComponent?.invokeMethod?.(methodName, ...args);\n }\n \n /**\n * Checks if a method is available on the component\n * @param methodName - Name of the method to check\n * @returns true if the method exists\n */\n hasMethod(methodName: string): boolean {\n return this.compiledComponent?.hasMethod?.(methodName) || false;\n }\n \n /**\n * Print the component content\n * Uses component's print method if available, otherwise uses window.print()\n */\n print(): void {\n if (this.compiledComponent?.print) {\n this.compiledComponent.print();\n } else if (typeof window !== 'undefined' && window.print) {\n window.print();\n }\n }\n\n /**\n * Force clear component registries\n * Used by Component Studio for fresh loads\n * This is a static method that can be called without a component instance\n */\n public static forceClearRegistries(): void {\n // Clear React runtime's component registry service\n ComponentRegistryService.reset();\n\n // Clear any cached hierarchy registrar\n if (typeof window !== 'undefined' && (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__) {\n (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__ = null;\n }\n\n console.log('🧹 All component registries cleared for fresh load');\n }\n\n /**\n * Gets the current data state from the hosted React component.\n * Falls back to a DataSnapshot built from intercepted RunView/RunQuery results\n * when the component does not explicitly implement getCurrentDataState.\n */\n public GetCurrentDataState(): DataSnapshot | undefined {\n return this.getCurrentDataState();\n }\n\n /**\n * Applies a data state snapshot to the hosted React component.\n * Returns true if the snapshot was successfully applied, false if the\n * component does not support setDataState or the operation failed.\n */\n public SetDataState(snapshot: DataSnapshot): boolean {\n return this.compiledComponent?.setDataState?.(snapshot) ?? false;\n }\n\n}"]}
@@ -4,7 +4,7 @@
4
4
  * @module @memberjunction/ng-react
5
5
  */
6
6
  import { Injectable } from '@angular/core';
7
- import { createReactRuntime, LibraryLoader, SetupStyles } from '@memberjunction/react-runtime';
7
+ import { createReactRuntime, LibraryLoader, BuildStylesFromTheme } from '@memberjunction/react-runtime';
8
8
  import { ScriptLoaderService } from './script-loader.service';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "./script-loader.service";
@@ -169,10 +169,12 @@ export class AngularAdapterService {
169
169
  'Make sure your component spec includes a "code" property with the React component source.');
170
170
  }
171
171
  await this.initialize();
172
- // Apply default styles if not provided
172
+ // Apply default styles if not provided — bridge the host's live MJ theme
173
+ // (--mj-* tokens) so compiled components match the active theme, including
174
+ // dark mode. Falls back to SetupStyles() defaults when no themed DOM exists.
173
175
  const optionsWithDefaults = {
174
176
  ...options,
175
- styles: options.styles || SetupStyles()
177
+ styles: options.styles || BuildStylesFromTheme()
176
178
  };
177
179
  return this.runtime.compiler.compile(optionsWithDefaults);
178
180
  }
@@ -1 +1 @@
1
- {"version":3,"file":"angular-adapter.service.js","sourceRoot":"","sources":["../../../src/lib/services/angular-adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular adapter service that bridges the React runtime with Angular.\n * Provides Angular-specific functionality for the platform-agnostic React runtime.\n * @module @memberjunction/ng-react\n */\n\nimport { Injectable } from '@angular/core';\nimport {\n ComponentCompiler,\n ComponentRegistry,\n ComponentResolver,\n ComponentManager,\n createReactRuntime,\n CompileOptions,\n RuntimeContext,\n ExternalLibraryConfig,\n LibraryConfiguration,\n LibraryLoader,\n SetupStyles\n} from '@memberjunction/react-runtime';\nimport { ScriptLoaderService } from './script-loader.service';\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\n\n/**\n * Angular-specific adapter for the React runtime.\n * Manages the integration between Angular services and the platform-agnostic React runtime.\n */\n@Injectable({ providedIn: 'root' })\nexport class AngularAdapterService {\n private runtime?: {\n compiler: ComponentCompiler;\n registry: ComponentRegistry;\n resolver: ComponentResolver;\n manager: ComponentManager;\n version: string;\n };\n private runtimeContext?: RuntimeContext;\n private initializationPromise: Promise<void> | undefined;\n\n constructor(private scriptLoader: ScriptLoaderService) {}\n\n /**\n * Eagerly start loading the React runtime in the background.\n * Call this at app startup (e.g., in APP_INITIALIZER or after auth) so that\n * React, ReactDOM, and Babel are already downloaded from CDN by the time the\n * user opens an interactive component artifact.\n *\n * Two-phase approach:\n * 1. Immediately inject `<link rel=\"preload\">` hints so the browser starts\n * downloading the CDN scripts in parallel with other page work.\n * 2. Fire-and-forget `initialize()` which creates `<script>` tags and\n * executes them. If the preload hints already fetched the bytes, the\n * script load is nearly instant (served from HTTP cache).\n *\n * Safe to call multiple times — the underlying initialize() deduplicates.\n * Does not block: returns immediately, initialization continues in background.\n */\n preload(): void {\n // Phase 1: Inject browser preload hints for CDN scripts\n LibraryLoader.preloadCoreScripts();\n\n // Phase 2: Fire-and-forget full initialization (script execution + runtime setup)\n this.initialize().catch(err => {\n console.warn('React runtime preload failed (will retry on demand):', err);\n });\n }\n\n /**\n * Initialize the React runtime with Angular-specific configuration\n * @param config Optional library configuration\n * @param additionalLibraries Optional additional libraries to merge\n * @param options Optional options including debug flag\n * @returns Promise resolving when runtime is ready\n */\n async initialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n if (this.runtime) {\n return; // Already initialized\n }\n if (this.initializationPromise) {\n return this.initializationPromise; // in progress\n }\n\n // Start initialization and store the promise immediately\n this.initializationPromise = this.doInitialize(config, additionalLibraries, options);\n\n try {\n await this.initializationPromise;\n } catch (error) {\n // Clear the promise on error so it can be retried\n this.initializationPromise = undefined;\n throw error;\n }\n\n return;\n }\n\n private async doInitialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n // Load React ecosystem with optional additional libraries\n const ecosystem = await this.scriptLoader.loadReactEcosystem(config, additionalLibraries, options);\n \n // Create runtime context\n this.runtimeContext = {\n React: ecosystem.React,\n ReactDOM: ecosystem.ReactDOM,\n libraries: ecosystem.libraries,\n utilities: {\n // Add any Angular-specific utilities here\n }\n };\n\n // Create the React runtime with runtime context for registry support\n this.runtime = createReactRuntime(ecosystem.Babel, {\n compiler: {\n cache: true,\n maxCacheSize: 100,\n debug: options?.debug\n },\n registry: {\n maxComponents: 1000,\n cleanupInterval: 60000,\n useLRU: true,\n enableNamespaces: true,\n debug: options?.debug\n }\n }, this.runtimeContext, options?.debug);\n }\n\n /**\n * Get the component compiler\n * @returns Component compiler instance\n */\n getCompiler(): ComponentCompiler {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.compiler;\n }\n\n /**\n * Get the component registry\n * @returns Component registry instance\n */\n getRegistry(): ComponentRegistry {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry;\n }\n\n /**\n * Get the component resolver\n * @returns Component resolver instance\n */\n getResolver(): ComponentResolver {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.resolver;\n }\n\n /**\n * Get the runtime context\n * @returns Runtime context with React and libraries\n */\n getRuntimeContext(): RuntimeContext {\n if (!this.runtimeContext) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtimeContext;\n }\n\n /**\n * Get the unified component manager\n * @returns Component manager instance\n */\n getComponentManager(): ComponentManager {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.manager;\n }\n\n\n /**\n * Compile a component with Angular-specific defaults\n * @param options - Compilation options\n * @returns Promise resolving to compilation result\n */\n async compileComponent(options: CompileOptions) {\n // Validate options before initialization\n if (!options) {\n throw new Error(\n 'Angular adapter error: No compilation options provided.\\n' +\n 'This usually means the component spec is null or undefined.\\n' +\n 'Please check that:\\n' +\n '1. Your component data is loaded properly\\n' +\n '2. The component spec has \"name\" and \"code\" properties\\n' +\n '3. The component input is not undefined'\n );\n }\n\n if (!options.componentName || options.componentName.trim() === '') {\n throw new Error(\n 'Angular adapter error: Component name is missing or empty.\\n' +\n `Received options: ${JSON.stringify(options, null, 2)}\\n` +\n 'Make sure your component spec includes a \"name\" property.'\n );\n }\n\n if (!options.componentCode || options.componentCode.trim() === '') {\n throw new Error(\n `Angular adapter error: Component code is missing or empty for component \"${options.componentName}\".\\n` +\n 'Make sure your component spec includes a \"code\" property with the React component source.'\n );\n }\n\n await this.initialize();\n \n // Apply default styles if not provided\n const optionsWithDefaults = {\n ...options,\n styles: options.styles || SetupStyles()\n };\n\n return this.runtime!.compiler.compile(optionsWithDefaults);\n }\n\n /**\n * Register a component in the registry\n * @param name - Component name\n * @param component - Compiled component\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component metadata\n */\n registerComponent(\n name: string,\n component: any,\n namespace: string = 'Global',\n version: string = 'v1'\n ) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.register(name, component, namespace, version);\n }\n\n /**\n * Get a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component if found\n */\n getComponent(name: string, namespace: string = 'Global', version?: string) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.get(name, namespace, version);\n }\n\n /**\n * Check if runtime is initialized\n * @returns true if initialized\n */\n isInitialized(): boolean {\n return !!this.runtime && !!this.runtimeContext;\n }\n\n /**\n * Get runtime version\n * @returns Runtime version string\n */\n getVersion(): string {\n return this.runtime?.version || 'unknown';\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.runtime) {\n this.runtime.registry.destroy();\n this.runtime = undefined;\n this.runtimeContext = undefined;\n }\n }\n\n /**\n * Get Babel instance for direct use\n * @returns Babel instance\n */\n getBabel(): any {\n return this.runtimeContext?.libraries?.Babel || (window as any).Babel;\n }\n\n /**\n * Transpile JSX code directly\n * @param code - JSX code to transpile\n * @param filename - Optional filename for better error messages\n * @returns Transpiled JavaScript code\n */\n transpileJSX(code: string, filename?: string): string {\n const babel = this.getBabel();\n if (!babel) {\n throw new Error('Babel not loaded. Initialize the runtime first.');\n }\n\n try {\n const result = babel.transform(code, {\n presets: ['react'],\n filename: filename || 'component.jsx'\n });\n return result.code;\n } catch (error: any) {\n throw new Error(`Failed to transpile JSX: ${error.message}`);\n }\n }\n}"]}
1
+ {"version":3,"file":"angular-adapter.service.js","sourceRoot":"","sources":["../../../src/lib/services/angular-adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular adapter service that bridges the React runtime with Angular.\n * Provides Angular-specific functionality for the platform-agnostic React runtime.\n * @module @memberjunction/ng-react\n */\n\nimport { Injectable } from '@angular/core';\nimport {\n ComponentCompiler,\n ComponentRegistry,\n ComponentResolver,\n ComponentManager,\n createReactRuntime,\n CompileOptions,\n RuntimeContext,\n ExternalLibraryConfig,\n LibraryConfiguration,\n LibraryLoader,\n BuildStylesFromTheme\n} from '@memberjunction/react-runtime';\nimport { ScriptLoaderService } from './script-loader.service';\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\n\n/**\n * Angular-specific adapter for the React runtime.\n * Manages the integration between Angular services and the platform-agnostic React runtime.\n */\n@Injectable({ providedIn: 'root' })\nexport class AngularAdapterService {\n private runtime?: {\n compiler: ComponentCompiler;\n registry: ComponentRegistry;\n resolver: ComponentResolver;\n manager: ComponentManager;\n version: string;\n };\n private runtimeContext?: RuntimeContext;\n private initializationPromise: Promise<void> | undefined;\n\n constructor(private scriptLoader: ScriptLoaderService) {}\n\n /**\n * Eagerly start loading the React runtime in the background.\n * Call this at app startup (e.g., in APP_INITIALIZER or after auth) so that\n * React, ReactDOM, and Babel are already downloaded from CDN by the time the\n * user opens an interactive component artifact.\n *\n * Two-phase approach:\n * 1. Immediately inject `<link rel=\"preload\">` hints so the browser starts\n * downloading the CDN scripts in parallel with other page work.\n * 2. Fire-and-forget `initialize()` which creates `<script>` tags and\n * executes them. If the preload hints already fetched the bytes, the\n * script load is nearly instant (served from HTTP cache).\n *\n * Safe to call multiple times — the underlying initialize() deduplicates.\n * Does not block: returns immediately, initialization continues in background.\n */\n preload(): void {\n // Phase 1: Inject browser preload hints for CDN scripts\n LibraryLoader.preloadCoreScripts();\n\n // Phase 2: Fire-and-forget full initialization (script execution + runtime setup)\n this.initialize().catch(err => {\n console.warn('React runtime preload failed (will retry on demand):', err);\n });\n }\n\n /**\n * Initialize the React runtime with Angular-specific configuration\n * @param config Optional library configuration\n * @param additionalLibraries Optional additional libraries to merge\n * @param options Optional options including debug flag\n * @returns Promise resolving when runtime is ready\n */\n async initialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n if (this.runtime) {\n return; // Already initialized\n }\n if (this.initializationPromise) {\n return this.initializationPromise; // in progress\n }\n\n // Start initialization and store the promise immediately\n this.initializationPromise = this.doInitialize(config, additionalLibraries, options);\n\n try {\n await this.initializationPromise;\n } catch (error) {\n // Clear the promise on error so it can be retried\n this.initializationPromise = undefined;\n throw error;\n }\n\n return;\n }\n\n private async doInitialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n // Load React ecosystem with optional additional libraries\n const ecosystem = await this.scriptLoader.loadReactEcosystem(config, additionalLibraries, options);\n \n // Create runtime context\n this.runtimeContext = {\n React: ecosystem.React,\n ReactDOM: ecosystem.ReactDOM,\n libraries: ecosystem.libraries,\n utilities: {\n // Add any Angular-specific utilities here\n }\n };\n\n // Create the React runtime with runtime context for registry support\n this.runtime = createReactRuntime(ecosystem.Babel, {\n compiler: {\n cache: true,\n maxCacheSize: 100,\n debug: options?.debug\n },\n registry: {\n maxComponents: 1000,\n cleanupInterval: 60000,\n useLRU: true,\n enableNamespaces: true,\n debug: options?.debug\n }\n }, this.runtimeContext, options?.debug);\n }\n\n /**\n * Get the component compiler\n * @returns Component compiler instance\n */\n getCompiler(): ComponentCompiler {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.compiler;\n }\n\n /**\n * Get the component registry\n * @returns Component registry instance\n */\n getRegistry(): ComponentRegistry {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry;\n }\n\n /**\n * Get the component resolver\n * @returns Component resolver instance\n */\n getResolver(): ComponentResolver {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.resolver;\n }\n\n /**\n * Get the runtime context\n * @returns Runtime context with React and libraries\n */\n getRuntimeContext(): RuntimeContext {\n if (!this.runtimeContext) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtimeContext;\n }\n\n /**\n * Get the unified component manager\n * @returns Component manager instance\n */\n getComponentManager(): ComponentManager {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.manager;\n }\n\n\n /**\n * Compile a component with Angular-specific defaults\n * @param options - Compilation options\n * @returns Promise resolving to compilation result\n */\n async compileComponent(options: CompileOptions) {\n // Validate options before initialization\n if (!options) {\n throw new Error(\n 'Angular adapter error: No compilation options provided.\\n' +\n 'This usually means the component spec is null or undefined.\\n' +\n 'Please check that:\\n' +\n '1. Your component data is loaded properly\\n' +\n '2. The component spec has \"name\" and \"code\" properties\\n' +\n '3. The component input is not undefined'\n );\n }\n\n if (!options.componentName || options.componentName.trim() === '') {\n throw new Error(\n 'Angular adapter error: Component name is missing or empty.\\n' +\n `Received options: ${JSON.stringify(options, null, 2)}\\n` +\n 'Make sure your component spec includes a \"name\" property.'\n );\n }\n\n if (!options.componentCode || options.componentCode.trim() === '') {\n throw new Error(\n `Angular adapter error: Component code is missing or empty for component \"${options.componentName}\".\\n` +\n 'Make sure your component spec includes a \"code\" property with the React component source.'\n );\n }\n\n await this.initialize();\n \n // Apply default styles if not provided — bridge the host's live MJ theme\n // (--mj-* tokens) so compiled components match the active theme, including\n // dark mode. Falls back to SetupStyles() defaults when no themed DOM exists.\n const optionsWithDefaults = {\n ...options,\n styles: options.styles || BuildStylesFromTheme()\n };\n\n return this.runtime!.compiler.compile(optionsWithDefaults);\n }\n\n /**\n * Register a component in the registry\n * @param name - Component name\n * @param component - Compiled component\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component metadata\n */\n registerComponent(\n name: string,\n component: any,\n namespace: string = 'Global',\n version: string = 'v1'\n ) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.register(name, component, namespace, version);\n }\n\n /**\n * Get a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component if found\n */\n getComponent(name: string, namespace: string = 'Global', version?: string) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.get(name, namespace, version);\n }\n\n /**\n * Check if runtime is initialized\n * @returns true if initialized\n */\n isInitialized(): boolean {\n return !!this.runtime && !!this.runtimeContext;\n }\n\n /**\n * Get runtime version\n * @returns Runtime version string\n */\n getVersion(): string {\n return this.runtime?.version || 'unknown';\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.runtime) {\n this.runtime.registry.destroy();\n this.runtime = undefined;\n this.runtimeContext = undefined;\n }\n }\n\n /**\n * Get Babel instance for direct use\n * @returns Babel instance\n */\n getBabel(): any {\n return this.runtimeContext?.libraries?.Babel || (window as any).Babel;\n }\n\n /**\n * Transpile JSX code directly\n * @param code - JSX code to transpile\n * @param filename - Optional filename for better error messages\n * @returns Transpiled JavaScript code\n */\n transpileJSX(code: string, filename?: string): string {\n const babel = this.getBabel();\n if (!babel) {\n throw new Error('Babel not loaded. Initialize the runtime first.');\n }\n\n try {\n const result = babel.transform(code, {\n presets: ['react'],\n filename: filename || 'component.jsx'\n });\n return result.code;\n } catch (error: any) {\n throw new Error(`Failed to transpile JSX: ${error.message}`);\n }\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-react",
3
- "version": "5.47.0",
3
+ "version": "5.49.0",
4
4
  "description": "Angular components for hosting React components in MemberJunction applications",
5
5
  "scripts": {
6
6
  "build": "ngc -p tsconfig.json",
@@ -41,14 +41,14 @@
41
41
  "styles"
42
42
  ],
43
43
  "dependencies": {
44
- "@memberjunction/ai-vectors-memory": "5.47.0",
45
- "@memberjunction/core": "5.47.0",
46
- "@memberjunction/core-entities": "5.47.0",
47
- "@memberjunction/global": "5.47.0",
48
- "@memberjunction/graphql-dataprovider": "5.47.0",
49
- "@memberjunction/interactive-component-types": "5.47.0",
50
- "@memberjunction/ng-notifications": "5.47.0",
51
- "@memberjunction/react-runtime": "5.47.0",
44
+ "@memberjunction/ai-vectors-memory": "5.49.0",
45
+ "@memberjunction/core": "5.49.0",
46
+ "@memberjunction/core-entities": "5.49.0",
47
+ "@memberjunction/global": "5.49.0",
48
+ "@memberjunction/graphql-dataprovider": "5.49.0",
49
+ "@memberjunction/interactive-component-types": "5.49.0",
50
+ "@memberjunction/ng-notifications": "5.49.0",
51
+ "@memberjunction/react-runtime": "5.49.0",
52
52
  "@angular/common": "21.1.3",
53
53
  "@angular/core": "21.1.3",
54
54
  "@angular/platform-browser": "21.1.3",
@@ -58,7 +58,7 @@
58
58
  "rxjs": "^7.8.2",
59
59
  "@types/react": "^19.2.13",
60
60
  "@types/react-dom": "^19.2.3",
61
- "@memberjunction/ng-base-types": "5.47.0"
61
+ "@memberjunction/ng-base-types": "5.49.0"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@angular/compiler": "21.1.3",