@memberjunction/ng-dashboards 5.32.0 → 5.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  2. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  3. package/dist/Admin/admin-data-schema.component.d.ts +16 -0
  4. package/dist/Admin/admin-data-schema.component.d.ts.map +1 -0
  5. package/dist/Admin/admin-data-schema.component.js +136 -0
  6. package/dist/Admin/admin-data-schema.component.js.map +1 -0
  7. package/dist/Admin/admin-dev-tools-resource.component.d.ts +14 -0
  8. package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -0
  9. package/dist/Admin/admin-dev-tools-resource.component.js +162 -0
  10. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -0
  11. package/dist/Admin/admin-identity-access.component.d.ts +15 -0
  12. package/dist/Admin/admin-identity-access.component.d.ts.map +1 -0
  13. package/dist/Admin/admin-identity-access.component.js +156 -0
  14. package/dist/Admin/admin-identity-access.component.js.map +1 -0
  15. package/dist/Admin/admin-monitoring.component.d.ts +15 -0
  16. package/dist/Admin/admin-monitoring.component.d.ts.map +1 -0
  17. package/dist/Admin/admin-monitoring.component.js +130 -0
  18. package/dist/Admin/admin-monitoring.component.js.map +1 -0
  19. package/dist/Admin/base-admin-container.component.d.ts +80 -0
  20. package/dist/Admin/base-admin-container.component.d.ts.map +1 -0
  21. package/dist/Admin/base-admin-container.component.js +198 -0
  22. package/dist/Admin/base-admin-container.component.js.map +1 -0
  23. package/dist/Admin/index.d.ts +6 -0
  24. package/dist/Admin/index.d.ts.map +1 -0
  25. package/dist/Admin/index.js +6 -0
  26. package/dist/Admin/index.js.map +1 -0
  27. package/dist/ComponentStudio/components/workspace/component-preview.component.js +1 -1
  28. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  29. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +28 -8
  30. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  31. package/dist/ComponentStudio/services/component-studio-state.service.js +45 -27
  32. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  33. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +18 -3
  34. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  35. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +51 -11
  36. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  37. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  38. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  39. package/dist/DevTools/app-state-inspector.component.d.ts +53 -0
  40. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -0
  41. package/dist/DevTools/app-state-inspector.component.js +301 -0
  42. package/dist/DevTools/app-state-inspector.component.js.map +1 -0
  43. package/dist/DevTools/class-registry.component.d.ts +64 -0
  44. package/dist/DevTools/class-registry.component.d.ts.map +1 -0
  45. package/dist/DevTools/class-registry.component.js +423 -0
  46. package/dist/DevTools/class-registry.component.js.map +1 -0
  47. package/dist/DevTools/dev-tools-prefs.d.ts +21 -0
  48. package/dist/DevTools/dev-tools-prefs.d.ts.map +1 -0
  49. package/dist/DevTools/dev-tools-prefs.js +48 -0
  50. package/dist/DevTools/dev-tools-prefs.js.map +1 -0
  51. package/dist/DevTools/event-monitor.component.d.ts +78 -0
  52. package/dist/DevTools/event-monitor.component.d.ts.map +1 -0
  53. package/dist/DevTools/event-monitor.component.js +659 -0
  54. package/dist/DevTools/event-monitor.component.js.map +1 -0
  55. package/dist/DevTools/graphql-console.component.d.ts +153 -0
  56. package/dist/DevTools/graphql-console.component.d.ts.map +1 -0
  57. package/dist/DevTools/graphql-console.component.js +1463 -0
  58. package/dist/DevTools/graphql-console.component.js.map +1 -0
  59. package/dist/DevTools/index.d.ts +8 -0
  60. package/dist/DevTools/index.d.ts.map +1 -0
  61. package/dist/DevTools/index.js +8 -0
  62. package/dist/DevTools/index.js.map +1 -0
  63. package/dist/DevTools/layout-inspector.component.d.ts +42 -0
  64. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -0
  65. package/dist/DevTools/layout-inspector.component.js +208 -0
  66. package/dist/DevTools/layout-inspector.component.js.map +1 -0
  67. package/dist/DevTools/lazy-module-status.component.d.ts +65 -0
  68. package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -0
  69. package/dist/DevTools/lazy-module-status.component.js +388 -0
  70. package/dist/DevTools/lazy-module-status.component.js.map +1 -0
  71. package/dist/DevTools/settings-explorer.component.d.ts +55 -0
  72. package/dist/DevTools/settings-explorer.component.d.ts.map +1 -0
  73. package/dist/DevTools/settings-explorer.component.js +394 -0
  74. package/dist/DevTools/settings-explorer.component.js.map +1 -0
  75. package/dist/Integration/components/widgets/integration-card.component.js +2 -2
  76. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  77. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  78. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  79. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +134 -1
  80. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  81. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1227 -24
  82. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  83. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  84. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  85. package/dist/Testing/components/testing-runs.component.js +3 -3
  86. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  87. package/dist/core-dashboards.module.d.ts +45 -34
  88. package/dist/core-dashboards.module.d.ts.map +1 -1
  89. package/dist/core-dashboards.module.js +57 -0
  90. package/dist/core-dashboards.module.js.map +1 -1
  91. package/dist/public-api.d.ts +2 -0
  92. package/dist/public-api.d.ts.map +1 -1
  93. package/dist/public-api.js +2 -0
  94. package/dist/public-api.js.map +1 -1
  95. package/package.json +52 -52
@@ -1,5 +1,6 @@
1
1
  import { Injectable, EventEmitter } from '@angular/core';
2
2
  import { RunView, CompositeKey, Metadata } from '@memberjunction/core';
3
+ import { ComponentMetadataEngine } from '@memberjunction/core-entities';
3
4
  import { ParseJSONRecursive } from '@memberjunction/global';
4
5
  import * as i0 from "@angular/core";
5
6
  /**
@@ -127,8 +128,9 @@ export class ComponentStudioStateService {
127
128
  EntityName: 'MJ: Components',
128
129
  ExtraFilter: 'HasRequiredCustomProps = 0',
129
130
  OrderBy: 'Name',
131
+ Fields: ['ID', 'Name', 'Namespace', 'Version', 'Type', 'Status', 'Description', 'HasRequiredCustomProps', '__mj_UpdatedAt'],
130
132
  MaxRows: 1000,
131
- ResultType: 'entity_object'
133
+ ResultType: 'simple'
132
134
  });
133
135
  if (result.Success) {
134
136
  this._dbComponents = result.Results || [];
@@ -155,15 +157,26 @@ export class ComponentStudioStateService {
155
157
  if (!currentUserId)
156
158
  return;
157
159
  this._favoriteComponents.clear();
158
- const favoritePromises = this._dbComponents.map(component => this.metadata.GetRecordFavoriteStatus(currentUserId, 'MJ: Components', CompositeKey.FromID(component.ID))
159
- .then(isFavorite => ({ componentId: component.ID, isFavorite }))
160
- .catch(() => ({ componentId: component.ID, isFavorite: false })));
161
- const results = await Promise.all(favoritePromises);
162
- for (const result of results) {
163
- if (result.isFavorite) {
164
- this._favoriteComponents.add(result.componentId);
160
+ try {
161
+ // Batch-load all favorites for this user + entity in a single query
162
+ // instead of one GetRecordFavoriteStatus call per component.
163
+ const rv = RunView.FromMetadataProvider(this.Provider);
164
+ const safeUserId = currentUserId.replace(/'/g, "''");
165
+ const result = await rv.RunView({
166
+ EntityName: 'MJ: User Favorites',
167
+ ExtraFilter: `UserID='${safeUserId}' AND Entity='MJ: Components'`,
168
+ Fields: ['RecordID'],
169
+ ResultType: 'simple'
170
+ });
171
+ if (result.Success) {
172
+ for (const row of result.Results) {
173
+ this._favoriteComponents.add(row.RecordID);
174
+ }
165
175
  }
166
176
  }
177
+ catch (error) {
178
+ console.error('Error loading favorites:', error);
179
+ }
167
180
  this.StateChanged.emit();
168
181
  }
169
182
  // ============================================================
@@ -337,8 +350,21 @@ export class ComponentStudioStateService {
337
350
  GetComponentVersion(component) {
338
351
  return component.isFileLoaded ? '1.0.0' : (component.Version || '1.0.0');
339
352
  }
340
- GetComponentSpec(component) {
341
- return component.isFileLoaded ? component.specification : JSON.parse(component.Specification);
353
+ /**
354
+ * Fetches the full component specification. For file-loaded components, returns
355
+ * the in-memory spec. For database components, loads the full entity record
356
+ * on demand via ComponentMetadataEngine.FindComponentByID() — the lightweight
357
+ * summary loaded at startup does not include the Specification column.
358
+ */
359
+ async GetComponentSpec(component) {
360
+ if (component.isFileLoaded) {
361
+ return component.specification;
362
+ }
363
+ const fullEntity = await ComponentMetadataEngine.Instance.FindComponentByID(component.ID);
364
+ if (!fullEntity || !fullEntity.Specification) {
365
+ throw new Error(`Component specification not found for: ${component.Name}`);
366
+ }
367
+ return JSON.parse(fullEntity.Specification);
342
368
  }
343
369
  GetComponentId(component) {
344
370
  return component.isFileLoaded ? component.id : component.ID;
@@ -361,9 +387,9 @@ export class ComponentStudioStateService {
361
387
  // ============================================================
362
388
  // COMPONENT RUNNING
363
389
  // ============================================================
364
- StartComponent(component) {
390
+ async StartComponent(component) {
365
391
  this._selectedComponent = component;
366
- this._componentSpec = this.GetComponentSpec(component);
392
+ this._componentSpec = await this.GetComponentSpec(component);
367
393
  this._isRunning = true;
368
394
  this._currentError = null;
369
395
  this._isDetailsPaneCollapsed = false;
@@ -381,21 +407,21 @@ export class ComponentStudioStateService {
381
407
  this._hasResolvedSpec = false;
382
408
  this.StateChanged.emit();
383
409
  }
384
- RunComponent(component) {
410
+ async RunComponent(component) {
385
411
  const componentId = this.GetComponentId(component);
386
412
  const selectedId = this._selectedComponent ? this.GetComponentId(this._selectedComponent) : null;
387
413
  if (this._isRunning && selectedId !== componentId) {
388
414
  this.StopComponent();
389
415
  }
390
- this.StartComponent(component);
416
+ await this.StartComponent(component);
391
417
  }
392
418
  // ============================================================
393
419
  // EDITORS
394
420
  // ============================================================
395
421
  InitializeEditors() {
396
- if (!this._selectedComponent)
422
+ if (!this._selectedComponent || !this._componentSpec)
397
423
  return;
398
- const spec = this.GetComponentSpec(this._selectedComponent);
424
+ const spec = this._componentSpec;
399
425
  const parseOptions = {
400
426
  extractInlineJson: true,
401
427
  maxDepth: 100,
@@ -415,8 +441,9 @@ export class ComponentStudioStateService {
415
441
  return;
416
442
  }
417
443
  // Use the in-memory spec (which may be the resolved version from the React bridge)
418
- // rather than re-parsing from the entity's raw Specification field.
419
- const spec = this._componentSpec || this.GetComponentSpec(this._selectedComponent);
444
+ if (!this._componentSpec)
445
+ return;
446
+ const spec = this._componentSpec;
420
447
  const sections = [];
421
448
  const mainCode = spec.code || '// No code available';
422
449
  sections.push({
@@ -449,9 +476,6 @@ export class ComponentStudioStateService {
449
476
  if (this.IsFileLoadedComponent(this._selectedComponent)) {
450
477
  this._selectedComponent.specification = parsed;
451
478
  }
452
- else {
453
- this._selectedComponent.Specification = JSON.stringify(parsed);
454
- }
455
479
  this._componentSpec = parsed;
456
480
  this._editableCode = parsed.code || '// No code available';
457
481
  this.BuildCodeSections();
@@ -496,9 +520,6 @@ export class ComponentStudioStateService {
496
520
  if (this.IsFileLoadedComponent(this._selectedComponent)) {
497
521
  this._selectedComponent.specification = spec;
498
522
  }
499
- else {
500
- this._selectedComponent.Specification = JSON.stringify(spec);
501
- }
502
523
  this._componentSpec = spec;
503
524
  this._isEditingCode = false;
504
525
  this._hasUnsavedChanges = true;
@@ -555,9 +576,6 @@ export class ComponentStudioStateService {
555
576
  if (this.IsFileLoadedComponent(this._selectedComponent)) {
556
577
  this._selectedComponent.specification = newSpec;
557
578
  }
558
- else {
559
- this._selectedComponent.Specification = JSON.stringify(newSpec);
560
- }
561
579
  this._componentSpec = newSpec;
562
580
  const parseOptions = {
563
581
  extractInlineJson: true,
@@ -1 +1 @@
1
- {"version":3,"file":"component-studio-state.service.js","sourceRoot":"","sources":["../../../src/ComponentStudio/services/component-studio-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { RunView, CompositeKey, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJComponentEntityExtended } from '@memberjunction/core-entities';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n/**\n * Interface for components loaded from files, text, or artifacts (not from database)\n */\nexport interface FileLoadedComponent {\n id: string;\n name: string;\n description?: string;\n specification: ComponentSpec;\n filename: string;\n loadedAt: Date;\n isFileLoaded: true;\n type?: string;\n status?: string;\n sourceArtifactID?: string;\n sourceVersionID?: string;\n}\n\n/**\n * Union type for both database and file-loaded components\n */\nexport type DisplayComponent = (MJComponentEntityExtended & { isFileLoaded?: false }) | FileLoadedComponent;\n\n/**\n * Category for filtering\n */\nexport interface Category {\n name: string;\n count: number;\n color: string;\n}\n\n/**\n * Component error info\n */\nexport interface ComponentError {\n type: string;\n message: string;\n technicalDetails?: Record<string, unknown> | string;\n}\n\n/**\n * Code section for the code editor tabbed panel\n */\nexport interface CodeSection {\n title: string;\n code: string;\n originalCode: string;\n isDependency: boolean;\n index?: number;\n}\n\n/**\n * Central state management service for Component Studio.\n * Decouples state from components so sub-components can share state.\n */\n@Injectable()\nexport class ComponentStudioStateService {\n\n // --- Component Data ---\n private _dbComponents: MJComponentEntityExtended[] = [];\n private _fileLoadedComponents: FileLoadedComponent[] = [];\n\n get DbComponents(): MJComponentEntityExtended[] { return this._dbComponents; }\n get FileLoadedComponents(): FileLoadedComponent[] { return this._fileLoadedComponents; }\n\n /** Combined list of all components (file-loaded first, then DB) */\n get AllComponents(): DisplayComponent[] {\n return [\n ...this._fileLoadedComponents,\n ...this._dbComponents\n ] as DisplayComponent[];\n }\n\n // --- Filtered Components ---\n private _filteredComponents: DisplayComponent[] = [];\n get FilteredComponents(): DisplayComponent[] { return this._filteredComponents; }\n\n // --- Selection & Running ---\n private _selectedComponent: DisplayComponent | null = null;\n private _expandedComponent: DisplayComponent | null = null;\n private _componentSpec: ComponentSpec | null = null;\n private _isRunning = false;\n\n get SelectedComponent(): DisplayComponent | null { return this._selectedComponent; }\n set SelectedComponent(value: DisplayComponent | null) { this._selectedComponent = value; }\n\n get ExpandedComponent(): DisplayComponent | null { return this._expandedComponent; }\n set ExpandedComponent(value: DisplayComponent | null) { this._expandedComponent = value; }\n\n get ComponentSpec(): ComponentSpec | null { return this._componentSpec; }\n set ComponentSpec(value: ComponentSpec | null) { this._componentSpec = value; }\n\n get IsRunning(): boolean { return this._isRunning; }\n set IsRunning(value: boolean) { this._isRunning = value; }\n\n // --- Loading ---\n private _isLoading = true;\n get IsLoading(): boolean { return this._isLoading; }\n\n // --- Error ---\n private _currentError: ComponentError | null = null;\n get CurrentError(): ComponentError | null { return this._currentError; }\n set CurrentError(value: ComponentError | null) { this._currentError = value; }\n\n // --- Filters ---\n private _searchQuery = '';\n private _selectedCategories: Set<string> = new Set();\n private _showOnlyFavorites = false;\n private _showDeprecatedComponents = false;\n private _showAllCategories = false;\n private _isFilterPanelExpanded = false;\n\n get SearchQuery(): string { return this._searchQuery; }\n set SearchQuery(value: string) {\n this._searchQuery = value;\n this.ApplyFilters();\n }\n\n get SelectedCategories(): Set<string> { return this._selectedCategories; }\n get ShowOnlyFavorites(): boolean { return this._showOnlyFavorites; }\n get ShowDeprecatedComponents(): boolean { return this._showDeprecatedComponents; }\n get ShowAllCategories(): boolean { return this._showAllCategories; }\n get IsFilterPanelExpanded(): boolean { return this._isFilterPanelExpanded; }\n\n // --- Favorites ---\n private _favoriteComponents: Set<string> = new Set();\n get FavoriteComponents(): Set<string> { return this._favoriteComponents; }\n\n // --- Categories ---\n private _availableCategories: Category[] = [];\n get AvailableCategories(): Category[] { return this._availableCategories; }\n\n // --- Editor State ---\n private _editableSpec = '';\n private _editableCode = '';\n private _codeSections: CodeSection[] = [];\n private _isEditingSpec = false;\n private _isEditingCode = false;\n private _activeTab = 0;\n private _isDetailsPaneCollapsed = true;\n\n get EditableSpec(): string { return this._editableSpec; }\n set EditableSpec(value: string) { this._editableSpec = value; }\n\n get EditableCode(): string { return this._editableCode; }\n set EditableCode(value: string) { this._editableCode = value; }\n\n get CodeSections(): CodeSection[] { return this._codeSections; }\n\n get IsEditingSpec(): boolean { return this._isEditingSpec; }\n set IsEditingSpec(value: boolean) { this._isEditingSpec = value; }\n\n get IsEditingCode(): boolean { return this._isEditingCode; }\n set IsEditingCode(value: boolean) { this._isEditingCode = value; }\n\n get ActiveTab(): number { return this._activeTab; }\n set ActiveTab(value: number) { this._activeTab = value; }\n\n get IsDetailsPaneCollapsed(): boolean { return this._isDetailsPaneCollapsed; }\n set IsDetailsPaneCollapsed(value: boolean) { this._isDetailsPaneCollapsed = value; }\n\n // --- Unsaved changes tracking ---\n private _hasUnsavedChanges = false;\n private _hasResolvedSpec = false;\n get HasUnsavedChanges(): boolean { return this._hasUnsavedChanges; }\n set HasUnsavedChanges(value: boolean) { this._hasUnsavedChanges = value; }\n\n // --- AI Panel ---\n private _isAIPanelCollapsed = false;\n get IsAIPanelCollapsed(): boolean { return this._isAIPanelCollapsed; }\n set IsAIPanelCollapsed(value: boolean) { this._isAIPanelCollapsed = value; }\n\n // --- Events ---\n /** Emitted when state changes require UI update */\n StateChanged = new EventEmitter<void>();\n\n /** Emitted when the running component needs to refresh */\n RefreshComponent = new EventEmitter<void>();\n\n /** Emitted when an error should be sent to AI for diagnosis */\n SendErrorToAI = new EventEmitter<ComponentError>();\n\n /** Emitted when a component spec is updated (e.g. by AI) */\n SpecUpdated = new EventEmitter<ComponentSpec>();\n\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private get metadata(): IMetadataProvider {\n return this.Provider;\n }\n\n // ============================================================\n // DATA LOADING\n // ============================================================\n\n async LoadComponents(): Promise<void> {\n this._isLoading = true;\n this.StateChanged.emit();\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJComponentEntityExtended>({\n EntityName: 'MJ: Components',\n ExtraFilter: 'HasRequiredCustomProps = 0',\n OrderBy: 'Name',\n MaxRows: 1000,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this._dbComponents = result.Results || [];\n this.ApplyFilters();\n this._isLoading = false;\n this.StateChanged.emit();\n\n // Load favorites in background\n this.loadFavorites();\n } else {\n console.error('Failed to load components:', result.ErrorMessage);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n } catch (error) {\n console.error('Error loading components:', error);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n }\n\n private async loadFavorites(): Promise<void> {\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n this._favoriteComponents.clear();\n\n const favoritePromises = this._dbComponents.map(component =>\n this.metadata.GetRecordFavoriteStatus(\n currentUserId,\n 'MJ: Components',\n CompositeKey.FromID(component.ID)\n )\n .then(isFavorite => ({ componentId: component.ID, isFavorite }))\n .catch(() => ({ componentId: component.ID, isFavorite: false }))\n );\n\n const results = await Promise.all(favoritePromises);\n for (const result of results) {\n if (result.isFavorite) {\n this._favoriteComponents.add(result.componentId);\n }\n }\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILTERING\n // ============================================================\n\n ApplyFilters(): void {\n this.buildCategories();\n\n let filtered = [...this.AllComponents];\n\n // Filter out deprecated\n if (!this._showDeprecatedComponents) {\n filtered = filtered.filter(c => this.GetComponentStatus(c) !== 'Deprecated');\n }\n\n // Favorites filter\n if (this._showOnlyFavorites) {\n filtered = filtered.filter(c => this.IsFavorite(c));\n }\n\n // Category filter\n if (this._selectedCategories.size > 0) {\n filtered = filtered.filter(c => {\n const namespace = this.GetComponentNamespace(c) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n return this._selectedCategories.has(category);\n });\n }\n\n // Search filter\n if (this._searchQuery) {\n const query = this._searchQuery.toLowerCase();\n filtered = filtered.filter(c => {\n const name = this.GetComponentName(c)?.toLowerCase() || '';\n const description = this.GetComponentDescription(c)?.toLowerCase() || '';\n const type = this.GetComponentType(c)?.toLowerCase() || '';\n const namespace = this.GetComponentNamespace(c)?.toLowerCase() || '';\n return name.includes(query) || description.includes(query) || type.includes(query) || namespace.includes(query);\n });\n }\n\n this._filteredComponents = filtered;\n }\n\n private buildCategories(): void {\n const categoryMap = new Map<string, number>();\n for (const component of this.AllComponents) {\n const namespace = this.GetComponentNamespace(component) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n this._availableCategories = Array.from(categoryMap.entries())\n .map(([name, count]) => ({\n name,\n count,\n color: this.getCategoryColor(name)\n }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractCategoryFromNamespace(namespace: string): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n return parts[0] || 'Uncategorized';\n }\n\n private getCategoryColor(category: string): string {\n const colors = [\n '#3B82F6', '#8B5CF6', '#10B981', '#F97316', '#06B6D4',\n '#EC4899', '#6366F1', '#14B8A6', '#EAB308', '#EF4444',\n ];\n let hash = 0;\n for (let i = 0; i < category.length; i++) {\n hash = category.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n ToggleFilterPanel(): void {\n this._isFilterPanelExpanded = !this._isFilterPanelExpanded;\n this.StateChanged.emit();\n }\n\n ToggleCategory(category: string): void {\n if (this._selectedCategories.has(category)) {\n this._selectedCategories.delete(category);\n } else {\n this._selectedCategories.add(category);\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowOnlyFavorites(): void {\n this._showOnlyFavorites = !this._showOnlyFavorites;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowDeprecatedComponents(): void {\n this._showDeprecatedComponents = !this._showDeprecatedComponents;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowAllCategories(): void {\n this._showAllCategories = !this._showAllCategories;\n this.StateChanged.emit();\n }\n\n ClearAllFilters(): void {\n this._selectedCategories.clear();\n this._showOnlyFavorites = false;\n this._showDeprecatedComponents = false;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n GetActiveFilterCount(): number {\n let count = 0;\n if (this._showOnlyFavorites) count++;\n if (this._showDeprecatedComponents) count++;\n count += this._selectedCategories.size;\n return count;\n }\n\n GetDeprecatedCount(): number {\n return this.AllComponents.filter(c => this.GetComponentStatus(c) === 'Deprecated').length;\n }\n\n GetVisibleCategories(): Category[] {\n return this._showAllCategories ? this._availableCategories : this._availableCategories.slice(0, 5);\n }\n\n IsCategorySelected(category: string): boolean {\n return this._selectedCategories.has(category);\n }\n\n // ============================================================\n // FAVORITES\n // ============================================================\n\n IsFavorite(component: DisplayComponent): boolean {\n if (this.IsFileLoadedComponent(component)) return false;\n return this._favoriteComponents.has(this.GetComponentId(component));\n }\n\n async ToggleFavorite(component: DisplayComponent): Promise<void> {\n if (this.IsFileLoadedComponent(component)) return;\n\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n const componentId = this.GetComponentId(component);\n const isFavorite = this._favoriteComponents.has(componentId);\n\n try {\n await this.metadata.SetRecordFavoriteStatus(\n currentUserId,\n 'MJ: Components',\n CompositeKey.FromID(componentId),\n !isFavorite,\n this.metadata.CurrentUser\n );\n\n if (isFavorite) {\n this._favoriteComponents.delete(componentId);\n } else {\n this._favoriteComponents.add(componentId);\n }\n this.StateChanged.emit();\n } catch (error) {\n console.error('Error toggling favorite status:', error);\n }\n }\n\n // ============================================================\n // COMPONENT ACCESSORS (for union type)\n // ============================================================\n\n IsFileLoadedComponent(component: DisplayComponent): component is FileLoadedComponent {\n return component.isFileLoaded === true;\n }\n\n GetComponentName(component: DisplayComponent): string {\n return component.isFileLoaded ? component.name : component.Name;\n }\n\n GetComponentDescription(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.description : (component.Description || undefined);\n }\n\n GetComponentType(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.type : (component.Type || undefined);\n }\n\n GetComponentStatus(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.status : (component.Status || undefined);\n }\n\n GetComponentVersion(component: DisplayComponent): string {\n return component.isFileLoaded ? '1.0.0' : (component.Version || '1.0.0');\n }\n\n GetComponentSpec(component: DisplayComponent): ComponentSpec {\n return component.isFileLoaded ? component.specification : JSON.parse(component.Specification);\n }\n\n GetComponentId(component: DisplayComponent): string {\n return component.isFileLoaded ? component.id : component.ID;\n }\n\n GetComponentNamespace(component: DisplayComponent): string | undefined {\n if (component.isFileLoaded) {\n return component.specification.namespace;\n }\n return (component as MJComponentEntityExtended).Namespace || undefined;\n }\n\n GetComponentFilename(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.filename : undefined;\n }\n\n GetComponentLoadedAt(component: DisplayComponent): Date | undefined {\n return component.isFileLoaded ? component.loadedAt : undefined;\n }\n\n GetComponentUpdatedAt(component: DisplayComponent): Date | undefined {\n return !component.isFileLoaded && component.__mj_UpdatedAt ? component.__mj_UpdatedAt : undefined;\n }\n\n // ============================================================\n // COMPONENT RUNNING\n // ============================================================\n\n StartComponent(component: DisplayComponent): void {\n this._selectedComponent = component;\n this._componentSpec = this.GetComponentSpec(component);\n this._isRunning = true;\n this._currentError = null;\n this._isDetailsPaneCollapsed = false;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.InitializeEditors();\n this.StateChanged.emit();\n }\n\n StopComponent(): void {\n this._isRunning = false;\n this._selectedComponent = null;\n this._componentSpec = null;\n this._currentError = null;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.StateChanged.emit();\n }\n\n RunComponent(component: DisplayComponent): void {\n const componentId = this.GetComponentId(component);\n const selectedId = this._selectedComponent ? this.GetComponentId(this._selectedComponent) : null;\n\n if (this._isRunning && selectedId !== componentId) {\n this.StopComponent();\n }\n this.StartComponent(component);\n }\n\n // ============================================================\n // EDITORS\n // ============================================================\n\n InitializeEditors(): void {\n if (!this._selectedComponent) return;\n\n const spec = this.GetComponentSpec(this._selectedComponent);\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = spec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = false;\n }\n\n BuildCodeSections(): void {\n if (!this._selectedComponent) {\n this._codeSections = [];\n return;\n }\n\n // Use the in-memory spec (which may be the resolved version from the React bridge)\n // rather than re-parsing from the entity's raw Specification field.\n const spec = this._componentSpec || this.GetComponentSpec(this._selectedComponent);\n const sections: CodeSection[] = [];\n\n const mainCode = spec.code || '// No code available';\n sections.push({\n title: spec.name || 'Main Component',\n code: mainCode,\n originalCode: mainCode,\n isDependency: false\n });\n\n if (spec.dependencies && Array.isArray(spec.dependencies)) {\n spec.dependencies.forEach((dep: ComponentSpec, index: number) => {\n const depCode = dep.code || '// No code available';\n sections.push({\n title: dep.name || `Dependency ${index + 1}`,\n code: depCode,\n originalCode: depCode,\n isDependency: true,\n index\n });\n });\n }\n\n this._codeSections = sections;\n }\n\n /**\n * Apply spec changes from the JSON editor back to the component\n */\n ApplySpecChanges(): boolean {\n try {\n const parsed = JSON.parse(this._editableSpec);\n\n if (this._selectedComponent) {\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = parsed;\n } else {\n (this._selectedComponent as MJComponentEntityExtended).Specification = JSON.stringify(parsed);\n }\n\n this._componentSpec = parsed;\n this._editableCode = parsed.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n }\n } catch (error) {\n console.error('Invalid JSON in spec editor:', error);\n }\n return false;\n }\n\n /**\n * Apply code changes from the code editor back to the spec\n */\n ApplyCodeChanges(): boolean {\n if (!this._selectedComponent) return false;\n\n try {\n const spec = JSON.parse(this._editableSpec);\n\n if (this._codeSections.length > 0) {\n spec.code = this._codeSections[0].code;\n\n if (this._codeSections.length > 1 && spec.dependencies) {\n for (let i = 1; i < this._codeSections.length; i++) {\n const section = this._codeSections[i];\n if (section.index !== undefined && spec.dependencies[section.index]) {\n spec.dependencies[section.index].code = section.code;\n }\n }\n }\n }\n\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = spec;\n } else {\n (this._selectedComponent as MJComponentEntityExtended).Specification = JSON.stringify(spec);\n }\n\n this._componentSpec = spec;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n } catch (error) {\n console.error('Error applying code changes:', error);\n }\n return false;\n }\n\n /**\n * Update the internal spec with the fully resolved version returned by the\n * React bridge after it loads the component hierarchy. This replaces\n * registry-reference stubs with real code so code sections show actual source.\n * Does NOT mark the component as having unsaved changes or trigger a re-render.\n *\n * Runs at most once per component load. The bridge re-resolves from the registry\n * on every refresh (including the refresh triggered by Apply Changes), and we\n * must not let that round-trip clobber edits the user has already applied.\n */\n UpdateWithResolvedSpec(resolvedSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n if (this._hasResolvedSpec) return;\n\n // Only update if the resolved spec actually differs (has real code)\n const current = this._componentSpec;\n if (!current || current === resolvedSpec) return;\n\n this._hasResolvedSpec = true;\n this._componentSpec = resolvedSpec;\n\n // Update editable spec JSON so Spec/Requirements/Design/Data tabs reflect resolved data\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(resolvedSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n // Update editable code with the resolved main code\n this._editableCode = resolvedSpec.code || '// No code available';\n\n // Rebuild code sections so the editor shows resolved dependency code\n this.BuildCodeSections();\n this.StateChanged.emit();\n }\n\n /**\n * Update the component spec directly (e.g., from AI)\n */\n UpdateSpec(newSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = newSpec;\n } else {\n (this._selectedComponent as MJComponentEntityExtended).Specification = JSON.stringify(newSpec);\n }\n\n this._componentSpec = newSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(newSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = newSpec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.SpecUpdated.emit(newSpec);\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILE-LOADED COMPONENT MANAGEMENT\n // ============================================================\n\n AddFileLoadedComponent(component: FileLoadedComponent): void {\n this._fileLoadedComponents.push(component);\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n RemoveFileLoadedComponent(component: FileLoadedComponent): void {\n const index = this._fileLoadedComponents.indexOf(component);\n if (index > -1) {\n this._fileLoadedComponents.splice(index, 1);\n if (this._selectedComponent === component) {\n this.StopComponent();\n }\n if (this._expandedComponent === component) {\n this._expandedComponent = null;\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n }\n\n GenerateId(): string {\n return 'file-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);\n }\n\n // ============================================================\n // UI HELPERS\n // ============================================================\n\n GetComponentTypeIcon(type: string | null | undefined): string {\n const icons: Record<string, string> = {\n 'Report': 'fa-file-alt',\n 'Dashboard': 'fa-tachometer-alt',\n 'Form': 'fa-edit',\n 'Chart': 'fa-chart-bar',\n 'Table': 'fa-table',\n 'Widget': 'fa-cube',\n 'Navigation': 'fa-compass',\n 'Search': 'fa-search',\n 'Utility': 'fa-cog'\n };\n return icons[type || ''] || 'fa-puzzle-piece';\n }\n\n GetComponentTypeColor(type: string | null | undefined): string {\n const colors: Record<string, string> = {\n 'Report': '#3B82F6',\n 'Dashboard': '#8B5CF6',\n 'Form': '#10B981',\n 'Chart': '#F97316',\n 'Table': '#06B6D4',\n 'Widget': '#EC4899',\n 'Navigation': '#6366F1',\n 'Search': '#14B8A6',\n 'Utility': '#64748B'\n };\n return colors[type || ''] || '#9CA3AF';\n }\n\n GetNamespaceColor(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return '#6C757D';\n const category = this.extractCategoryFromNamespace(namespace);\n return this.getCategoryColor(category);\n }\n\n FormatNamespace(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n if (parts.length > 3) {\n return `${parts[0]} / ... / ${parts[parts.length - 1]}`;\n }\n return parts.join(' / ');\n }\n\n /**\n * Get the current spec, preferring edited version if available\n */\n GetCurrentSpec(): ComponentSpec | null {\n if (!this._selectedComponent || !this._componentSpec) return null;\n\n if (this._isEditingSpec || this._isEditingCode) {\n try {\n return JSON.parse(this._editableSpec);\n } catch {\n return this._componentSpec;\n }\n }\n return this._componentSpec;\n }\n}\n"]}
1
+ {"version":3,"file":"component-studio-state.service.js","sourceRoot":"","sources":["../../../src/ComponentStudio/services/component-studio-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAoB,MAAM,wBAAwB,CAAC;;AAwE9E;;;GAGG;AAEH,MAAM,OAAO,2BAA2B;IAEtC,yBAAyB;IACjB,aAAa,GAAyB,EAAE,CAAC;IACzC,qBAAqB,GAA0B,EAAE,CAAC;IAE1D,IAAI,YAAY,KAA2B,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvE,IAAI,oBAAoB,KAA4B,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAExF,mEAAmE;IACnE,IAAI,aAAa;QACf,OAAO;YACL,GAAG,IAAI,CAAC,qBAAqB;YAC7B,GAAG,IAAI,CAAC,aAAa;SACA,CAAC;IAC1B,CAAC;IAED,8BAA8B;IACtB,mBAAmB,GAAuB,EAAE,CAAC;IACrD,IAAI,kBAAkB,KAAyB,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAEjF,8BAA8B;IACtB,kBAAkB,GAA4B,IAAI,CAAC;IACnD,kBAAkB,GAA4B,IAAI,CAAC;IACnD,cAAc,GAAyB,IAAI,CAAC;IAC5C,UAAU,GAAG,KAAK,CAAC;IAE3B,IAAI,iBAAiB,KAA8B,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpF,IAAI,iBAAiB,CAAC,KAA8B,IAAI,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1F,IAAI,iBAAiB,KAA8B,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpF,IAAI,iBAAiB,CAAC,KAA8B,IAAI,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1F,IAAI,aAAa,KAA2B,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACzE,IAAI,aAAa,CAAC,KAA2B,IAAI,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;IAE/E,IAAI,SAAS,KAAc,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,IAAI,SAAS,CAAC,KAAc,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1D,kBAAkB;IACV,UAAU,GAAG,IAAI,CAAC;IAC1B,IAAI,SAAS,KAAc,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpD,gBAAgB;IACR,aAAa,GAA0B,IAAI,CAAC;IACpD,IAAI,YAAY,KAA4B,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY,CAAC,KAA4B,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;IAE9E,kBAAkB;IACV,YAAY,GAAG,EAAE,CAAC;IAClB,mBAAmB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC7C,kBAAkB,GAAG,KAAK,CAAC;IAC3B,yBAAyB,GAAG,KAAK,CAAC;IAClC,kBAAkB,GAAG,KAAK,CAAC;IAC3B,sBAAsB,GAAG,KAAK,CAAC;IAEvC,IAAI,WAAW,KAAa,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,IAAI,WAAW,CAAC,KAAa;QAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,kBAAkB,KAAkB,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1E,IAAI,iBAAiB,KAAc,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpE,IAAI,wBAAwB,KAAc,OAAO,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAClF,IAAI,iBAAiB,KAAc,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpE,IAAI,qBAAqB,KAAc,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAE5E,oBAAoB;IACZ,mBAAmB,GAAgB,IAAI,GAAG,EAAE,CAAC;IACrD,IAAI,kBAAkB,KAAkB,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1E,qBAAqB;IACb,oBAAoB,GAAe,EAAE,CAAC;IAC9C,IAAI,mBAAmB,KAAiB,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3E,uBAAuB;IACf,aAAa,GAAG,EAAE,CAAC;IACnB,aAAa,GAAG,EAAE,CAAC;IACnB,aAAa,GAAkB,EAAE,CAAC;IAClC,cAAc,GAAG,KAAK,CAAC;IACvB,cAAc,GAAG,KAAK,CAAC;IACvB,UAAU,GAAG,CAAC,CAAC;IACf,uBAAuB,GAAG,IAAI,CAAC;IAEvC,IAAI,YAAY,KAAa,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,KAAa,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,YAAY,KAAa,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,KAAa,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,YAAY,KAAoB,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhE,IAAI,aAAa,KAAc,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,KAAc,IAAI,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;IAElE,IAAI,aAAa,KAAc,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,KAAc,IAAI,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;IAElE,IAAI,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,KAAa,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IAEzD,IAAI,sBAAsB,KAAc,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC9E,IAAI,sBAAsB,CAAC,KAAc,IAAI,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC,CAAC,CAAC;IAEpF,mCAAmC;IAC3B,kBAAkB,GAAG,KAAK,CAAC;IAC3B,gBAAgB,GAAG,KAAK,CAAC;IACjC,IAAI,iBAAiB,KAAc,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpE,IAAI,iBAAiB,CAAC,KAAc,IAAI,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1E,mBAAmB;IACX,mBAAmB,GAAG,KAAK,CAAC;IACpC,IAAI,kBAAkB,KAAc,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtE,IAAI,kBAAkB,CAAC,KAAc,IAAI,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC;IAE5E,iBAAiB;IACjB,mDAAmD;IACnD,YAAY,GAAG,IAAI,YAAY,EAAQ,CAAC;IAExC,0DAA0D;IAC1D,gBAAgB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE5C,+DAA+D;IAC/D,aAAa,GAAG,IAAI,YAAY,EAAkB,CAAC;IAEnD,4DAA4D;IAC5D,WAAW,GAAG,IAAI,YAAY,EAAiB,CAAC;IAExC,SAAS,GAA6B,IAAI,CAAC;IAEnD,sGAAsG;IACtG,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,+DAA+D;IAC/D,eAAe;IACf,+DAA+D;IAE/D,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBAClD,UAAU,EAAE,gBAAgB;gBAC5B,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,wBAAwB,EAAE,gBAAgB,CAAC;gBAC3H,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBAEzB,+BAA+B;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBACjE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,oEAAoE;YACpE,6DAA6D;YAC7D,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBAClD,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,WAAW,UAAU,+BAA+B;gBACjE,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,YAAY;IACZ,+DAA+D;IAE/D,YAAY;QACV,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvC,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;QAC/E,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC9C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACzE,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACrE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACtC,CAAC;IAEO,eAAe;QACrB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC;YAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;YAC9D,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI;YACJ,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SACnC,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,4BAA4B,CAAC,SAAiB;QACpD,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe;YAAE,OAAO,eAAe,CAAC;QACxE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;YACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;SACtD,CAAC;QACF,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACnD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,8BAA8B;QAC5B,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACjE,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB;QAClB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,CAAC,kBAAkB;YAAE,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,yBAAyB;YAAE,KAAK,EAAE,CAAC;QAC5C,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;IAC5F,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,kBAAkB,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,+DAA+D;IAC/D,YAAY;IACZ,+DAA+D;IAE/D,UAAU,CAAC,SAA2B;QACpC,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QACxD,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAA2B;QAC9C,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;YAAE,OAAO;QAElD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CACzC,aAAa,EACb,gBAAgB,EAChB,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAChC,CAAC,UAAU,EACX,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC1B,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,uCAAuC;IACvC,+DAA+D;IAE/D,qBAAqB,CAAC,SAA2B;QAC/C,OAAO,SAAS,CAAC,YAAY,KAAK,IAAI,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,SAA2B;QAC1C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,uBAAuB,CAAC,SAA2B;QACjD,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IAC/F,CAAC;IAED,gBAAgB,CAAC,SAA2B;QAC1C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IACjF,CAAC;IAED,kBAAkB,CAAC,SAA2B;QAC5C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;IACrF,CAAC;IAED,mBAAmB,CAAC,SAA2B;QAC7C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAA2B;QAChD,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,aAAa,CAAC;QACjC,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED,cAAc,CAAC,SAA2B;QACxC,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,qBAAqB,CAAC,SAA2B;QAC/C,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED,oBAAoB,CAAC,SAA2B;QAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED,oBAAoB,CAAC,SAA2B;QAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED,qBAAqB,CAAC,SAA2B;QAC/C,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACpG,CAAC;IAED,+DAA+D;IAC/D,oBAAoB;IACpB,+DAA+D;IAE/D,KAAK,CAAC,cAAc,CAAC,SAA2B;QAC9C,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAA2B;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjG,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,+DAA+D;IAC/D,UAAU;IACV,+DAA+D;IAE/D,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;QACjC,MAAM,YAAY,GAAqB;YACrC,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,sBAAsB,CAAC;QACzD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,mFAAmF;QACnF,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;QACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,sBAAsB,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,gBAAgB;YACpC,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,QAAQ;YACtB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAkB,EAAE,KAAa,EAAE,EAAE;gBAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,sBAAsB,CAAC;gBACnD,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,cAAc,KAAK,GAAG,CAAC,EAAE;oBAC5C,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,OAAO;oBACrB,YAAY,EAAE,IAAI;oBAClB,KAAK;iBACN,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACxD,IAAI,CAAC,kBAAkB,CAAC,aAAa,GAAG,MAAM,CAAC;gBACjD,CAAC;gBAED,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;gBAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,IAAI,sBAAsB,CAAC;gBAC3D,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE5C,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAEvC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;wBACtC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BACpE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAqB;gBACrC,iBAAiB,EAAE,IAAI;gBACvB,QAAQ,EAAE,GAAG;gBACb,KAAK,EAAE,KAAK;aACb,CAAC;YACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAErD,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,kBAAkB,CAAC,aAAa,GAAG,IAAI,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;OASG;IACH,sBAAsB,CAAC,YAA2B;QAChD,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACrC,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAElC,oEAAoE;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,YAAY;YAAE,OAAO;QAEjD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;QAEnC,wFAAwF;QACxF,MAAM,YAAY,GAAqB;YACrC,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,mDAAmD;QACnD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,IAAI,IAAI,sBAAsB,CAAC;QAEjE,qEAAqE;QACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAErC,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,kBAAkB,CAAC,aAAa,GAAG,OAAO,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,MAAM,YAAY,GAAqB;YACrC,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,sBAAsB,CAAC;QAC5D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,mCAAmC;IACnC,+DAA+D;IAE/D,sBAAsB,CAAC,SAA8B;QACnD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,yBAAyB,CAAC,SAA8B;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,+DAA+D;IAC/D,aAAa;IACb,+DAA+D;IAE/D,oBAAoB,CAAC,IAA+B;QAClD,MAAM,KAAK,GAA2B;YACpC,QAAQ,EAAE,aAAa;YACvB,WAAW,EAAE,mBAAmB;YAChC,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,YAAY;YAC1B,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,iBAAiB,CAAC;IAChD,CAAC;IAED,qBAAqB,CAAC,IAA+B;QACnD,MAAM,MAAM,GAA2B;YACrC,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,SAAS;YACnB,YAAY,EAAE,SAAS;YACvB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC;IACzC,CAAC;IAED,iBAAiB,CAAC,SAA6B;QAC7C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe;YAAE,OAAO,SAAS,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,SAA6B;QAC3C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe;YAAE,OAAO,eAAe,CAAC;QACxE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAElE,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,cAAc,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;qHA7wBU,2BAA2B;gEAA3B,2BAA2B,WAA3B,2BAA2B;;iFAA3B,2BAA2B;cADvC,UAAU","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { RunView, CompositeKey, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n/**\n * Lightweight summary of a database component for the browser list.\n * Only contains fields needed for display — Specification and other heavy\n * columns are fetched on demand when a component is selected.\n */\nexport interface DbComponentSummary {\n ID: string;\n Name: string;\n Namespace: string | null;\n Version: string | null;\n Type: string | null;\n Status: string | null;\n Description: string | null;\n HasRequiredCustomProps: boolean;\n __mj_UpdatedAt: Date | null;\n isFileLoaded?: false;\n}\n\n/**\n * Interface for components loaded from files, text, or artifacts (not from database)\n */\nexport interface FileLoadedComponent {\n id: string;\n name: string;\n description?: string;\n specification: ComponentSpec;\n filename: string;\n loadedAt: Date;\n isFileLoaded: true;\n type?: string;\n status?: string;\n sourceArtifactID?: string;\n sourceVersionID?: string;\n}\n\n/**\n * Union type for both database and file-loaded components\n */\nexport type DisplayComponent = DbComponentSummary | FileLoadedComponent;\n\n/**\n * Category for filtering\n */\nexport interface Category {\n name: string;\n count: number;\n color: string;\n}\n\n/**\n * Component error info\n */\nexport interface ComponentError {\n type: string;\n message: string;\n technicalDetails?: Record<string, unknown> | string;\n}\n\n/**\n * Code section for the code editor tabbed panel\n */\nexport interface CodeSection {\n title: string;\n code: string;\n originalCode: string;\n isDependency: boolean;\n index?: number;\n}\n\n/**\n * Central state management service for Component Studio.\n * Decouples state from components so sub-components can share state.\n */\n@Injectable()\nexport class ComponentStudioStateService {\n\n // --- Component Data ---\n private _dbComponents: DbComponentSummary[] = [];\n private _fileLoadedComponents: FileLoadedComponent[] = [];\n\n get DbComponents(): DbComponentSummary[] { return this._dbComponents; }\n get FileLoadedComponents(): FileLoadedComponent[] { return this._fileLoadedComponents; }\n\n /** Combined list of all components (file-loaded first, then DB) */\n get AllComponents(): DisplayComponent[] {\n return [\n ...this._fileLoadedComponents,\n ...this._dbComponents\n ] as DisplayComponent[];\n }\n\n // --- Filtered Components ---\n private _filteredComponents: DisplayComponent[] = [];\n get FilteredComponents(): DisplayComponent[] { return this._filteredComponents; }\n\n // --- Selection & Running ---\n private _selectedComponent: DisplayComponent | null = null;\n private _expandedComponent: DisplayComponent | null = null;\n private _componentSpec: ComponentSpec | null = null;\n private _isRunning = false;\n\n get SelectedComponent(): DisplayComponent | null { return this._selectedComponent; }\n set SelectedComponent(value: DisplayComponent | null) { this._selectedComponent = value; }\n\n get ExpandedComponent(): DisplayComponent | null { return this._expandedComponent; }\n set ExpandedComponent(value: DisplayComponent | null) { this._expandedComponent = value; }\n\n get ComponentSpec(): ComponentSpec | null { return this._componentSpec; }\n set ComponentSpec(value: ComponentSpec | null) { this._componentSpec = value; }\n\n get IsRunning(): boolean { return this._isRunning; }\n set IsRunning(value: boolean) { this._isRunning = value; }\n\n // --- Loading ---\n private _isLoading = true;\n get IsLoading(): boolean { return this._isLoading; }\n\n // --- Error ---\n private _currentError: ComponentError | null = null;\n get CurrentError(): ComponentError | null { return this._currentError; }\n set CurrentError(value: ComponentError | null) { this._currentError = value; }\n\n // --- Filters ---\n private _searchQuery = '';\n private _selectedCategories: Set<string> = new Set();\n private _showOnlyFavorites = false;\n private _showDeprecatedComponents = false;\n private _showAllCategories = false;\n private _isFilterPanelExpanded = false;\n\n get SearchQuery(): string { return this._searchQuery; }\n set SearchQuery(value: string) {\n this._searchQuery = value;\n this.ApplyFilters();\n }\n\n get SelectedCategories(): Set<string> { return this._selectedCategories; }\n get ShowOnlyFavorites(): boolean { return this._showOnlyFavorites; }\n get ShowDeprecatedComponents(): boolean { return this._showDeprecatedComponents; }\n get ShowAllCategories(): boolean { return this._showAllCategories; }\n get IsFilterPanelExpanded(): boolean { return this._isFilterPanelExpanded; }\n\n // --- Favorites ---\n private _favoriteComponents: Set<string> = new Set();\n get FavoriteComponents(): Set<string> { return this._favoriteComponents; }\n\n // --- Categories ---\n private _availableCategories: Category[] = [];\n get AvailableCategories(): Category[] { return this._availableCategories; }\n\n // --- Editor State ---\n private _editableSpec = '';\n private _editableCode = '';\n private _codeSections: CodeSection[] = [];\n private _isEditingSpec = false;\n private _isEditingCode = false;\n private _activeTab = 0;\n private _isDetailsPaneCollapsed = true;\n\n get EditableSpec(): string { return this._editableSpec; }\n set EditableSpec(value: string) { this._editableSpec = value; }\n\n get EditableCode(): string { return this._editableCode; }\n set EditableCode(value: string) { this._editableCode = value; }\n\n get CodeSections(): CodeSection[] { return this._codeSections; }\n\n get IsEditingSpec(): boolean { return this._isEditingSpec; }\n set IsEditingSpec(value: boolean) { this._isEditingSpec = value; }\n\n get IsEditingCode(): boolean { return this._isEditingCode; }\n set IsEditingCode(value: boolean) { this._isEditingCode = value; }\n\n get ActiveTab(): number { return this._activeTab; }\n set ActiveTab(value: number) { this._activeTab = value; }\n\n get IsDetailsPaneCollapsed(): boolean { return this._isDetailsPaneCollapsed; }\n set IsDetailsPaneCollapsed(value: boolean) { this._isDetailsPaneCollapsed = value; }\n\n // --- Unsaved changes tracking ---\n private _hasUnsavedChanges = false;\n private _hasResolvedSpec = false;\n get HasUnsavedChanges(): boolean { return this._hasUnsavedChanges; }\n set HasUnsavedChanges(value: boolean) { this._hasUnsavedChanges = value; }\n\n // --- AI Panel ---\n private _isAIPanelCollapsed = false;\n get IsAIPanelCollapsed(): boolean { return this._isAIPanelCollapsed; }\n set IsAIPanelCollapsed(value: boolean) { this._isAIPanelCollapsed = value; }\n\n // --- Events ---\n /** Emitted when state changes require UI update */\n StateChanged = new EventEmitter<void>();\n\n /** Emitted when the running component needs to refresh */\n RefreshComponent = new EventEmitter<void>();\n\n /** Emitted when an error should be sent to AI for diagnosis */\n SendErrorToAI = new EventEmitter<ComponentError>();\n\n /** Emitted when a component spec is updated (e.g. by AI) */\n SpecUpdated = new EventEmitter<ComponentSpec>();\n\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private get metadata(): IMetadataProvider {\n return this.Provider;\n }\n\n // ============================================================\n // DATA LOADING\n // ============================================================\n\n async LoadComponents(): Promise<void> {\n this._isLoading = true;\n this.StateChanged.emit();\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<DbComponentSummary>({\n EntityName: 'MJ: Components',\n ExtraFilter: 'HasRequiredCustomProps = 0',\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Namespace', 'Version', 'Type', 'Status', 'Description', 'HasRequiredCustomProps', '__mj_UpdatedAt'],\n MaxRows: 1000,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this._dbComponents = result.Results || [];\n this.ApplyFilters();\n this._isLoading = false;\n this.StateChanged.emit();\n\n // Load favorites in background\n this.loadFavorites();\n } else {\n console.error('Failed to load components:', result.ErrorMessage);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n } catch (error) {\n console.error('Error loading components:', error);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n }\n\n private async loadFavorites(): Promise<void> {\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n this._favoriteComponents.clear();\n\n try {\n // Batch-load all favorites for this user + entity in a single query\n // instead of one GetRecordFavoriteStatus call per component.\n const rv = RunView.FromMetadataProvider(this.Provider);\n const safeUserId = currentUserId.replace(/'/g, \"''\");\n const result = await rv.RunView<{RecordID: string}>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${safeUserId}' AND Entity='MJ: Components'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n this._favoriteComponents.add(row.RecordID);\n }\n }\n } catch (error) {\n console.error('Error loading favorites:', error);\n }\n\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILTERING\n // ============================================================\n\n ApplyFilters(): void {\n this.buildCategories();\n\n let filtered = [...this.AllComponents];\n\n // Filter out deprecated\n if (!this._showDeprecatedComponents) {\n filtered = filtered.filter(c => this.GetComponentStatus(c) !== 'Deprecated');\n }\n\n // Favorites filter\n if (this._showOnlyFavorites) {\n filtered = filtered.filter(c => this.IsFavorite(c));\n }\n\n // Category filter\n if (this._selectedCategories.size > 0) {\n filtered = filtered.filter(c => {\n const namespace = this.GetComponentNamespace(c) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n return this._selectedCategories.has(category);\n });\n }\n\n // Search filter\n if (this._searchQuery) {\n const query = this._searchQuery.toLowerCase();\n filtered = filtered.filter(c => {\n const name = this.GetComponentName(c)?.toLowerCase() || '';\n const description = this.GetComponentDescription(c)?.toLowerCase() || '';\n const type = this.GetComponentType(c)?.toLowerCase() || '';\n const namespace = this.GetComponentNamespace(c)?.toLowerCase() || '';\n return name.includes(query) || description.includes(query) || type.includes(query) || namespace.includes(query);\n });\n }\n\n this._filteredComponents = filtered;\n }\n\n private buildCategories(): void {\n const categoryMap = new Map<string, number>();\n for (const component of this.AllComponents) {\n const namespace = this.GetComponentNamespace(component) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n this._availableCategories = Array.from(categoryMap.entries())\n .map(([name, count]) => ({\n name,\n count,\n color: this.getCategoryColor(name)\n }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractCategoryFromNamespace(namespace: string): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n return parts[0] || 'Uncategorized';\n }\n\n private getCategoryColor(category: string): string {\n const colors = [\n '#3B82F6', '#8B5CF6', '#10B981', '#F97316', '#06B6D4',\n '#EC4899', '#6366F1', '#14B8A6', '#EAB308', '#EF4444',\n ];\n let hash = 0;\n for (let i = 0; i < category.length; i++) {\n hash = category.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n ToggleFilterPanel(): void {\n this._isFilterPanelExpanded = !this._isFilterPanelExpanded;\n this.StateChanged.emit();\n }\n\n ToggleCategory(category: string): void {\n if (this._selectedCategories.has(category)) {\n this._selectedCategories.delete(category);\n } else {\n this._selectedCategories.add(category);\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowOnlyFavorites(): void {\n this._showOnlyFavorites = !this._showOnlyFavorites;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowDeprecatedComponents(): void {\n this._showDeprecatedComponents = !this._showDeprecatedComponents;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowAllCategories(): void {\n this._showAllCategories = !this._showAllCategories;\n this.StateChanged.emit();\n }\n\n ClearAllFilters(): void {\n this._selectedCategories.clear();\n this._showOnlyFavorites = false;\n this._showDeprecatedComponents = false;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n GetActiveFilterCount(): number {\n let count = 0;\n if (this._showOnlyFavorites) count++;\n if (this._showDeprecatedComponents) count++;\n count += this._selectedCategories.size;\n return count;\n }\n\n GetDeprecatedCount(): number {\n return this.AllComponents.filter(c => this.GetComponentStatus(c) === 'Deprecated').length;\n }\n\n GetVisibleCategories(): Category[] {\n return this._showAllCategories ? this._availableCategories : this._availableCategories.slice(0, 5);\n }\n\n IsCategorySelected(category: string): boolean {\n return this._selectedCategories.has(category);\n }\n\n // ============================================================\n // FAVORITES\n // ============================================================\n\n IsFavorite(component: DisplayComponent): boolean {\n if (this.IsFileLoadedComponent(component)) return false;\n return this._favoriteComponents.has(this.GetComponentId(component));\n }\n\n async ToggleFavorite(component: DisplayComponent): Promise<void> {\n if (this.IsFileLoadedComponent(component)) return;\n\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n const componentId = this.GetComponentId(component);\n const isFavorite = this._favoriteComponents.has(componentId);\n\n try {\n await this.metadata.SetRecordFavoriteStatus(\n currentUserId,\n 'MJ: Components',\n CompositeKey.FromID(componentId),\n !isFavorite,\n this.metadata.CurrentUser\n );\n\n if (isFavorite) {\n this._favoriteComponents.delete(componentId);\n } else {\n this._favoriteComponents.add(componentId);\n }\n this.StateChanged.emit();\n } catch (error) {\n console.error('Error toggling favorite status:', error);\n }\n }\n\n // ============================================================\n // COMPONENT ACCESSORS (for union type)\n // ============================================================\n\n IsFileLoadedComponent(component: DisplayComponent): component is FileLoadedComponent {\n return component.isFileLoaded === true;\n }\n\n GetComponentName(component: DisplayComponent): string {\n return component.isFileLoaded ? component.name : component.Name;\n }\n\n GetComponentDescription(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.description : (component.Description || undefined);\n }\n\n GetComponentType(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.type : (component.Type || undefined);\n }\n\n GetComponentStatus(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.status : (component.Status || undefined);\n }\n\n GetComponentVersion(component: DisplayComponent): string {\n return component.isFileLoaded ? '1.0.0' : (component.Version || '1.0.0');\n }\n\n /**\n * Fetches the full component specification. For file-loaded components, returns\n * the in-memory spec. For database components, loads the full entity record\n * on demand via ComponentMetadataEngine.FindComponentByID() — the lightweight\n * summary loaded at startup does not include the Specification column.\n */\n async GetComponentSpec(component: DisplayComponent): Promise<ComponentSpec> {\n if (component.isFileLoaded) {\n return component.specification;\n }\n const fullEntity = await ComponentMetadataEngine.Instance.FindComponentByID(component.ID);\n if (!fullEntity || !fullEntity.Specification) {\n throw new Error(`Component specification not found for: ${component.Name}`);\n }\n return JSON.parse(fullEntity.Specification);\n }\n\n GetComponentId(component: DisplayComponent): string {\n return component.isFileLoaded ? component.id : component.ID;\n }\n\n GetComponentNamespace(component: DisplayComponent): string | undefined {\n if (component.isFileLoaded) {\n return component.specification.namespace;\n }\n return component.Namespace || undefined;\n }\n\n GetComponentFilename(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.filename : undefined;\n }\n\n GetComponentLoadedAt(component: DisplayComponent): Date | undefined {\n return component.isFileLoaded ? component.loadedAt : undefined;\n }\n\n GetComponentUpdatedAt(component: DisplayComponent): Date | undefined {\n return !component.isFileLoaded && component.__mj_UpdatedAt ? component.__mj_UpdatedAt : undefined;\n }\n\n // ============================================================\n // COMPONENT RUNNING\n // ============================================================\n\n async StartComponent(component: DisplayComponent): Promise<void> {\n this._selectedComponent = component;\n this._componentSpec = await this.GetComponentSpec(component);\n this._isRunning = true;\n this._currentError = null;\n this._isDetailsPaneCollapsed = false;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.InitializeEditors();\n this.StateChanged.emit();\n }\n\n StopComponent(): void {\n this._isRunning = false;\n this._selectedComponent = null;\n this._componentSpec = null;\n this._currentError = null;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.StateChanged.emit();\n }\n\n async RunComponent(component: DisplayComponent): Promise<void> {\n const componentId = this.GetComponentId(component);\n const selectedId = this._selectedComponent ? this.GetComponentId(this._selectedComponent) : null;\n\n if (this._isRunning && selectedId !== componentId) {\n this.StopComponent();\n }\n await this.StartComponent(component);\n }\n\n // ============================================================\n // EDITORS\n // ============================================================\n\n InitializeEditors(): void {\n if (!this._selectedComponent || !this._componentSpec) return;\n\n const spec = this._componentSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = spec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = false;\n }\n\n BuildCodeSections(): void {\n if (!this._selectedComponent) {\n this._codeSections = [];\n return;\n }\n\n // Use the in-memory spec (which may be the resolved version from the React bridge)\n if (!this._componentSpec) return;\n const spec = this._componentSpec;\n const sections: CodeSection[] = [];\n\n const mainCode = spec.code || '// No code available';\n sections.push({\n title: spec.name || 'Main Component',\n code: mainCode,\n originalCode: mainCode,\n isDependency: false\n });\n\n if (spec.dependencies && Array.isArray(spec.dependencies)) {\n spec.dependencies.forEach((dep: ComponentSpec, index: number) => {\n const depCode = dep.code || '// No code available';\n sections.push({\n title: dep.name || `Dependency ${index + 1}`,\n code: depCode,\n originalCode: depCode,\n isDependency: true,\n index\n });\n });\n }\n\n this._codeSections = sections;\n }\n\n /**\n * Apply spec changes from the JSON editor back to the component\n */\n ApplySpecChanges(): boolean {\n try {\n const parsed = JSON.parse(this._editableSpec);\n\n if (this._selectedComponent) {\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = parsed;\n }\n\n this._componentSpec = parsed;\n this._editableCode = parsed.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n }\n } catch (error) {\n console.error('Invalid JSON in spec editor:', error);\n }\n return false;\n }\n\n /**\n * Apply code changes from the code editor back to the spec\n */\n ApplyCodeChanges(): boolean {\n if (!this._selectedComponent) return false;\n\n try {\n const spec = JSON.parse(this._editableSpec);\n\n if (this._codeSections.length > 0) {\n spec.code = this._codeSections[0].code;\n\n if (this._codeSections.length > 1 && spec.dependencies) {\n for (let i = 1; i < this._codeSections.length; i++) {\n const section = this._codeSections[i];\n if (section.index !== undefined && spec.dependencies[section.index]) {\n spec.dependencies[section.index].code = section.code;\n }\n }\n }\n }\n\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = spec;\n }\n\n this._componentSpec = spec;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n } catch (error) {\n console.error('Error applying code changes:', error);\n }\n return false;\n }\n\n /**\n * Update the internal spec with the fully resolved version returned by the\n * React bridge after it loads the component hierarchy. This replaces\n * registry-reference stubs with real code so code sections show actual source.\n * Does NOT mark the component as having unsaved changes or trigger a re-render.\n *\n * Runs at most once per component load. The bridge re-resolves from the registry\n * on every refresh (including the refresh triggered by Apply Changes), and we\n * must not let that round-trip clobber edits the user has already applied.\n */\n UpdateWithResolvedSpec(resolvedSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n if (this._hasResolvedSpec) return;\n\n // Only update if the resolved spec actually differs (has real code)\n const current = this._componentSpec;\n if (!current || current === resolvedSpec) return;\n\n this._hasResolvedSpec = true;\n this._componentSpec = resolvedSpec;\n\n // Update editable spec JSON so Spec/Requirements/Design/Data tabs reflect resolved data\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(resolvedSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n // Update editable code with the resolved main code\n this._editableCode = resolvedSpec.code || '// No code available';\n\n // Rebuild code sections so the editor shows resolved dependency code\n this.BuildCodeSections();\n this.StateChanged.emit();\n }\n\n /**\n * Update the component spec directly (e.g., from AI)\n */\n UpdateSpec(newSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = newSpec;\n }\n\n this._componentSpec = newSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(newSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = newSpec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.SpecUpdated.emit(newSpec);\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILE-LOADED COMPONENT MANAGEMENT\n // ============================================================\n\n AddFileLoadedComponent(component: FileLoadedComponent): void {\n this._fileLoadedComponents.push(component);\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n RemoveFileLoadedComponent(component: FileLoadedComponent): void {\n const index = this._fileLoadedComponents.indexOf(component);\n if (index > -1) {\n this._fileLoadedComponents.splice(index, 1);\n if (this._selectedComponent === component) {\n this.StopComponent();\n }\n if (this._expandedComponent === component) {\n this._expandedComponent = null;\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n }\n\n GenerateId(): string {\n return 'file-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);\n }\n\n // ============================================================\n // UI HELPERS\n // ============================================================\n\n GetComponentTypeIcon(type: string | null | undefined): string {\n const icons: Record<string, string> = {\n 'Report': 'fa-file-alt',\n 'Dashboard': 'fa-tachometer-alt',\n 'Form': 'fa-edit',\n 'Chart': 'fa-chart-bar',\n 'Table': 'fa-table',\n 'Widget': 'fa-cube',\n 'Navigation': 'fa-compass',\n 'Search': 'fa-search',\n 'Utility': 'fa-cog'\n };\n return icons[type || ''] || 'fa-puzzle-piece';\n }\n\n GetComponentTypeColor(type: string | null | undefined): string {\n const colors: Record<string, string> = {\n 'Report': '#3B82F6',\n 'Dashboard': '#8B5CF6',\n 'Form': '#10B981',\n 'Chart': '#F97316',\n 'Table': '#06B6D4',\n 'Widget': '#EC4899',\n 'Navigation': '#6366F1',\n 'Search': '#14B8A6',\n 'Utility': '#64748B'\n };\n return colors[type || ''] || '#9CA3AF';\n }\n\n GetNamespaceColor(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return '#6C757D';\n const category = this.extractCategoryFromNamespace(namespace);\n return this.getCategoryColor(category);\n }\n\n FormatNamespace(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n if (parts.length > 3) {\n return `${parts[0]} / ... / ${parts[parts.length - 1]}`;\n }\n return parts.join(' / ');\n }\n\n /**\n * Get the current spec, preferring edited version if available\n */\n GetCurrentSpec(): ComponentSpec | null {\n if (!this._selectedComponent || !this._componentSpec) return null;\n\n if (this._isEditingSpec || this._isEditingCode) {\n try {\n return JSON.parse(this._editableSpec);\n } catch {\n return this._componentSpec;\n }\n }\n return this._componentSpec;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { ChangeDetectorRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { EntityInfo, CompositeKey } from '@memberjunction/core';
3
3
  import { TreeBranchConfig, TreeLeafConfig, TreeNode, TreeComponent } from '@memberjunction/ng-trees';
4
4
  import { RecentItem, FavoriteItem, AppEntityGroup } from '../../models/explorer-state.interface';
@@ -18,7 +18,9 @@ export interface SelectRecordEvent {
18
18
  entityName: string;
19
19
  recordId: string;
20
20
  }
21
- export declare class NavigationPanelComponent extends BaseAngularComponent implements OnChanges {
21
+ export declare class NavigationPanelComponent extends BaseAngularComponent implements OnChanges, OnInit, OnDestroy {
22
+ private cdr;
23
+ constructor(cdr: ChangeDetectorRef);
22
24
  entities: EntityInfo[];
23
25
  selectedEntityName: string | null;
24
26
  favorites: FavoriteItem[];
@@ -56,6 +58,8 @@ export declare class NavigationPanelComponent extends BaseAngularComponent imple
56
58
  /** Search term for filtering the entity tree */
57
59
  entitySearchTerm: string;
58
60
  ngOnChanges(changes: SimpleChanges): void;
61
+ ngOnInit(): void;
62
+ ngOnDestroy(): void;
59
63
  /**
60
64
  * Update the selected entity IDs for tree highlighting when selected entity changes
61
65
  */
@@ -121,9 +125,20 @@ export declare class NavigationPanelComponent extends BaseAngularComponent imple
121
125
  */
122
126
  getEntityIcon(entity: EntityInfo): string;
123
127
  /**
124
- * Format recent item timestamp
128
+ * Cache of formatted relative-time labels keyed by timestamp epoch ms.
129
+ * Stable within a change-detection cycle (avoids NG0100 from `now`-dependent
130
+ * values shifting between dirty-check and verify passes). Cleared on a coarse
131
+ * interval so the displayed label still updates over time.
132
+ */
133
+ private timestampLabelCache;
134
+ private timestampRefreshHandle?;
135
+ /**
136
+ * Format recent item timestamp. Cached per-timestamp so the same value is
137
+ * returned across change-detection passes within a single tick — recomputed
138
+ * on a 30-second interval (see `ngOnInit`).
125
139
  */
126
140
  formatTimestamp(timestamp: Date): string;
141
+ private computeRelativeLabel;
127
142
  /**
128
143
  * Get icon for a recent item based on its entity
129
144
  */
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/navigation-panel/navigation-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAa,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAMa,wBAAyB,SAAQ,oBAAqB,YAAW,SAAS;IAC5E,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAM;IAC/B,SAAS,UAAS;IAC3B;;;OAGG;IACM,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAQ;IACvD,gEAAgE;IACvD,eAAe,EAAE,cAAc,EAAE,CAAM;IAChD,kDAAkD;IACzC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG1C,wBAAwB,UAAQ;IAChC,qBAAqB,UAAQ;IAC7B,uBAAuB,UAAQ;IAC/B,oBAAoB,UAAQ;IAE3B,cAAc,2BAAkC;IAChD,cAAc,qBAA4B;IAC1C,cAAc,8DAAqE;IACnF,UAAU,gCAAuC;IAC3D,yGAAyG;IAC/F,YAAY,kCAAyC;IAC/D,mFAAmF;IACzE,cAAc,oDAA2D;IACnF,oDAAoD;IAC1C,eAAe,uBAA8B;IAEvD,OAAO,KAAK,QAAQ,GAAiC;IAG9C,gBAAgB,EAAE,gBAAgB,CAMvC;IAEK,cAAc,EAAE,cAAc,CAYnC;IAEuB,UAAU,CAAC,EAAE,aAAa,CAAC;IAEpD,+CAA+C;IACxC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAExC,gDAAgD;IACzC,gBAAgB,SAAM;IAE7B,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IASzC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAU7B;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAY7C;;OAEG;IACH,IAAI,mBAAmB,IAAI,UAAU,EAAE,CAKtC;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,YAAY,EAAE,CAMpC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAMrC;IAED;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIvC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAqB7C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAarC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI;IAI7E;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI;IAIxE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAI7C;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAoBzC;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM;IAkBxC;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAQ3C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;yCAnTpC,wBAAwB;2CAAxB,wBAAwB;CAsUpC"}
1
+ {"version":3,"file":"navigation-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/navigation-panel/navigation-panel.component.ts"],"names":[],"mappings":"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"}