@memberjunction/ng-dashboards 5.33.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.
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +28 -8
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +45 -27
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +18 -3
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +51 -11
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +134 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1227 -24
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +3 -3
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- 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: '
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
341
|
-
|
|
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.
|
|
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
|
-
|
|
419
|
-
|
|
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":"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","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
|
-
*
|
|
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;
|
|
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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"}
|