@memberjunction/ng-dashboards 5.8.0 → 5.10.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 (84) hide show
  1. package/dist/AI/components/models/model-management.component.d.ts +2 -0
  2. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  3. package/dist/AI/components/models/model-management.component.js +44 -2
  4. package/dist/AI/components/models/model-management.component.js.map +1 -1
  5. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  6. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +15 -12
  7. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  8. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  9. package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
  10. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
  13. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  14. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  15. package/dist/Home/home-dashboard.component.js +10 -7
  16. package/dist/Home/home-dashboard.component.js.map +1 -1
  17. package/dist/Integration/components/activity/activity.component.d.ts +96 -0
  18. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
  19. package/dist/Integration/components/activity/activity.component.js +961 -0
  20. package/dist/Integration/components/activity/activity.component.js.map +1 -0
  21. package/dist/Integration/components/connections/connections.component.d.ts +194 -0
  22. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
  23. package/dist/Integration/components/connections/connections.component.js +2368 -0
  24. package/dist/Integration/components/connections/connections.component.js.map +1 -0
  25. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +213 -15
  26. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  27. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2093 -187
  28. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  29. package/dist/Integration/components/overview/overview.component.d.ts +60 -0
  30. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
  31. package/dist/Integration/components/overview/overview.component.js +628 -0
  32. package/dist/Integration/components/overview/overview.component.js.map +1 -0
  33. package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
  34. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
  35. package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
  36. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
  37. package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
  38. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
  39. package/dist/Integration/components/schedules/schedules.component.js +842 -0
  40. package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
  41. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
  42. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
  43. package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
  44. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
  45. package/dist/Integration/components/widgets/run-history-panel.component.js +3 -2
  46. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  47. package/dist/Integration/index.d.ts +5 -3
  48. package/dist/Integration/index.d.ts.map +1 -1
  49. package/dist/Integration/index.js +11 -7
  50. package/dist/Integration/index.js.map +1 -1
  51. package/dist/Integration/integration.module.d.ts +20 -16
  52. package/dist/Integration/integration.module.d.ts.map +1 -1
  53. package/dist/Integration/integration.module.js +40 -21
  54. package/dist/Integration/integration.module.js.map +1 -1
  55. package/dist/Integration/services/integration-data.service.d.ts +123 -9
  56. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  57. package/dist/Integration/services/integration-data.service.js +385 -68
  58. package/dist/Integration/services/integration-data.service.js.map +1 -1
  59. package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
  60. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  61. package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
  62. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  63. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  64. package/dist/__tests__/mapping-validation.test.d.ts +2 -0
  65. package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
  66. package/dist/__tests__/mapping-validation.test.js +170 -0
  67. package/dist/__tests__/mapping-validation.test.js.map +1 -0
  68. package/package.json +40 -38
  69. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +0 -81
  70. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +0 -1
  71. package/dist/Integration/components/connection-studio/connection-studio.component.js +0 -960
  72. package/dist/Integration/components/connection-studio/connection-studio.component.js.map +0 -1
  73. package/dist/Integration/components/control-tower/control-tower.component.d.ts +0 -43
  74. package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +0 -1
  75. package/dist/Integration/components/control-tower/control-tower.component.js +0 -446
  76. package/dist/Integration/components/control-tower/control-tower.component.js.map +0 -1
  77. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +0 -65
  78. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +0 -1
  79. package/dist/Integration/components/sync-activity/sync-activity.component.js +0 -671
  80. package/dist/Integration/components/sync-activity/sync-activity.component.js.map +0 -1
  81. package/dist/__tests__/connection-studio.test.d.ts +0 -2
  82. package/dist/__tests__/connection-studio.test.d.ts.map +0 -1
  83. package/dist/__tests__/connection-studio.test.js +0 -186
  84. package/dist/__tests__/connection-studio.test.js.map +0 -1
@@ -66,6 +66,8 @@ export declare class ModelManagementComponent extends BaseResourceComponent impl
66
66
  constructor(sharedService: SharedService, navigationService: NavigationService, cdr: ChangeDetectorRef);
67
67
  ngOnInit(): void;
68
68
  ngOnDestroy(): void;
69
+ private subscribeToCacheInvalidation;
70
+ private refreshDataFromEngine;
69
71
  private setupSearchListener;
70
72
  /**
71
73
  * Load saved user preferences from the UserInfoEngine
@@ -1 +1 @@
1
- {"version":3,"file":"model-management.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/models/model-management.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-management.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/models/model-management.component.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,10 @@ import { Component } from '@angular/core';
8
8
  import { Subject, BehaviorSubject } from 'rxjs';
9
9
  import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
10
10
  import { UserInfoEngine } from '@memberjunction/core-entities';
11
- import { Metadata, CompositeKey } from '@memberjunction/core';
11
+ import { BaseEntity, Metadata, CompositeKey } from '@memberjunction/core';
12
12
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
13
13
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
14
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
14
+ import { RegisterClass, UUIDsEqual, MJGlobal, MJEventType } from '@memberjunction/global';
15
15
  import * as i0 from "@angular/core";
16
16
  import * as i1 from "@memberjunction/ng-shared";
17
17
  import * as i2 from "@angular/forms";
@@ -880,6 +880,8 @@ let ModelManagementComponent = class ModelManagementComponent extends BaseResour
880
880
  if (this.Data?.Configuration) {
881
881
  this.applyInitialState(this.Data.Configuration);
882
882
  }
883
+ // Subscribe to remote cache invalidation events for real-time updates
884
+ this.subscribeToCacheInvalidation();
883
885
  }
884
886
  ngOnDestroy() {
885
887
  this.destroy$.next();
@@ -888,6 +890,46 @@ let ModelManagementComponent = class ModelManagementComponent extends BaseResour
888
890
  clearInterval(this.loadingMessageInterval);
889
891
  }
890
892
  }
893
+ subscribeToCacheInvalidation() {
894
+ MJGlobal.Instance.GetEventListener(true)
895
+ .pipe(takeUntil(this.destroy$))
896
+ .subscribe(event => {
897
+ if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode)
898
+ return;
899
+ const beEvent = event.args;
900
+ if (beEvent.type !== 'remote-invalidate')
901
+ return;
902
+ const entityName = beEvent.entityName?.toLowerCase().trim();
903
+ if (entityName === 'mj: ai models' || entityName === 'mj: ai model types') {
904
+ console.log(`[AI Models Dashboard] Remote invalidation for "${beEvent.entityName}" — refreshing`);
905
+ // Small delay to let BaseEngine finish its LoadSingleConfig network call
906
+ setTimeout(() => this.refreshDataFromEngine(), 500);
907
+ }
908
+ });
909
+ }
910
+ refreshDataFromEngine() {
911
+ const models = AIEngineBase.Instance.Models;
912
+ this.vendors = AIEngineBase.Instance.Vendors;
913
+ this.modelTypes = AIEngineBase.Instance.ModelTypes;
914
+ const vendorMap = new Map(this.vendors.map(v => [v.ID, v.Name]));
915
+ const typeMap = new Map(this.modelTypes.map(t => [t.ID, t.Name]));
916
+ this.models = models.map((model) => {
917
+ let vendorId;
918
+ if (model.Vendor) {
919
+ const vendor = this.vendors.find(v => v.Name === model.Vendor);
920
+ vendorId = vendor?.ID;
921
+ }
922
+ const modelWithDisplay = model;
923
+ modelWithDisplay.VendorID = vendorId;
924
+ modelWithDisplay.VendorName = model.Vendor || 'No Vendor';
925
+ modelWithDisplay.ModelTypeName = model.AIModelTypeID ? typeMap.get(model.AIModelTypeID) || 'Unknown' : 'No Type';
926
+ return model;
927
+ });
928
+ this.filteredModels = [...this.models];
929
+ this.sortModels();
930
+ this.applyFilters();
931
+ this.cdr.detectChanges();
932
+ }
891
933
  setupSearchListener() {
892
934
  this.searchSubject.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(searchTerm => {
893
935
  this.searchTerm = searchTerm;
@@ -1 +1 @@
1
- {"version":3,"file":"model-management.component.js","sourceRoot":"","sources":["../../../../src/AI/components/models/model-management.component.ts","../../../../src/AI/components/models/model-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { MJAIVendorEntity, MJAIModelTypeEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { SharedService, BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\n\ninterface ModelDisplayData extends MJAIModelEntityExtended {\n VendorName?: string;\n VendorID?: string; // Add this since we're using it for filtering\n ModelTypeName?: string;\n PowerRankDisplay?: string;\n SpeedRankDisplay?: string;\n CostRankDisplay?: string;\n}\n\n/**\n * User preferences for the Model Management dashboard\n */\ninterface ModelManagementUserPreferences {\n viewMode: 'grid' | 'list';\n showFilters: boolean;\n searchTerm: string;\n selectedVendor: string;\n selectedType: string;\n selectedStatus: string;\n sortBy: string;\n sortDirection: 'asc' | 'desc';\n}\n\n/**\n * AI Models Resource - displays AI model management\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIModelsResource')\n@Component({\n standalone: false,\n selector: 'app-model-management',\n templateUrl: './model-management.component.html',\n styleUrls: ['./model-management.component.css']\n})\nexport class ModelManagementComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'AI.Models.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n // View state\n public viewMode: 'grid' | 'list' = 'grid';\n public isLoading = true;\n public showFilters = true;\n public expandedModelId: string | null = null;\n\n // Data - Keep as MJAIModelEntityExtended to preserve getters\n public models: MJAIModelEntityExtended[] = [];\n public filteredModels: MJAIModelEntityExtended[] = [];\n public vendors: MJAIVendorEntity[] = [];\n public modelTypes: MJAIModelTypeEntity[] = [];\n\n // Filtering\n public searchTerm = '';\n private searchSubject = new BehaviorSubject<string>('');\n public selectedVendor = 'all';\n public selectedType = 'all';\n public selectedStatus = 'all';\n public powerRankRange = { min: 0, max: 10 };\n public speedRankRange = { min: 0, max: 10 };\n public costRankRange = { min: 0, max: 10 };\n\n // Detail panel\n public selectedModel: ModelDisplayData | null = null;\n public detailPanelVisible = false;\n\n // Sorting\n public sortBy = 'name';\n public sortDirection: 'asc' | 'desc' = 'asc';\n public sortOptions = [\n { value: 'name', label: 'Name' },\n { value: 'vendor', label: 'Vendor' },\n { value: 'type', label: 'Type' },\n { value: 'powerRank', label: 'Power Rank' },\n { value: 'speedRank', label: 'Speed Rank' },\n { value: 'costRank', label: 'Cost Rank' },\n { value: 'created', label: 'Created Date' },\n { value: 'updated', label: 'Updated Date' }\n ];\n\n // Max rank values calculated from all models\n public maxPowerRank = 10;\n public maxSpeedRank = 10;\n public maxCostRank = 10;\n\n // Loading messages\n public loadingMessages = [\n 'Loading AI models...',\n 'Fetching vendor information...',\n 'Calculating rankings...',\n 'Almost ready...'\n ];\n public currentLoadingMessage = this.loadingMessages[0];\n private loadingMessageIndex = 0;\n private loadingMessageInterval: any;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private sharedService: SharedService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n ngOnInit(): void {\n // Load saved user preferences first\n this.loadUserPreferences();\n\n this.setupSearchListener();\n this.startLoadingMessages();\n this.loadInitialData();\n\n // Apply initial state from resource configuration if provided (overrides saved prefs)\n if (this.Data?.Configuration) {\n this.applyInitialState(this.Data.Configuration);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n }\n\n private setupSearchListener(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(searchTerm => {\n this.searchTerm = searchTerm;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n });\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as ModelManagementUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[ModelManagement] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: ModelManagementUserPreferences): void {\n if (prefs.viewMode) {\n this.viewMode = prefs.viewMode;\n }\n if (prefs.showFilters !== undefined) {\n this.showFilters = prefs.showFilters;\n }\n if (prefs.searchTerm) {\n this.searchTerm = prefs.searchTerm;\n }\n if (prefs.selectedVendor) {\n this.selectedVendor = prefs.selectedVendor;\n }\n if (prefs.selectedType) {\n this.selectedType = prefs.selectedType;\n }\n if (prefs.selectedStatus) {\n this.selectedStatus = prefs.selectedStatus;\n }\n if (prefs.sortBy) {\n this.sortBy = prefs.sortBy;\n }\n if (prefs.sortDirection) {\n this.sortDirection = prefs.sortDirection;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): ModelManagementUserPreferences {\n return {\n viewMode: this.viewMode,\n showFilters: this.showFilters,\n searchTerm: this.searchTerm,\n selectedVendor: this.selectedVendor,\n selectedType: this.selectedType,\n selectedStatus: this.selectedStatus,\n sortBy: this.sortBy,\n sortDirection: this.sortDirection\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[ModelManagement] Failed to persist user preferences:', error);\n }\n }\n\n private startLoadingMessages(): void {\n this.loadingMessageInterval = setInterval(() => {\n this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];\n }, 2000);\n }\n\n private async loadInitialData(): Promise<void> {\n try {\n // Ensure AIEngineBase is configured (no-op if already loaded)\n await AIEngineBase.Instance.Config(false);\n\n // Get cached data from AIEngineBase\n const models = AIEngineBase.Instance.Models;\n this.vendors = AIEngineBase.Instance.Vendors;\n this.modelTypes = AIEngineBase.Instance.ModelTypes;\n \n // Log summary data\n \n // Create lookup maps\n const vendorMap = new Map(this.vendors.map(v => [v.ID, v.Name]));\n const typeMap = new Map(this.modelTypes.map(t => [t.ID, t.Name]));\n\n // Transform models to display format\n this.models = models.map((model) => {\n \n // Find vendor ID by matching vendor name\n let vendorId: string | undefined;\n if (model.Vendor) {\n const vendor = this.vendors.find(v => v.Name === model.Vendor);\n vendorId = vendor?.ID;\n }\n \n // Don't spread the model - it loses getter properties!\n // Instead, augment the model with display properties\n const modelWithDisplay = model as ModelDisplayData;\n modelWithDisplay.VendorID = vendorId;\n modelWithDisplay.VendorName = model.Vendor || 'No Vendor';\n modelWithDisplay.ModelTypeName = model.AIModelTypeID ? typeMap.get(model.AIModelTypeID) || 'Unknown' : 'No Type';\n \n return model;\n });\n\n // Calculate max values for each rank type from ALL models\n this.maxPowerRank = Math.max(...this.models.map(m => m.PowerRank || 0), 10);\n this.maxSpeedRank = Math.max(...this.models.map(m => m.SpeedRank || 0), 10);\n this.maxCostRank = Math.max(...this.models.map(m => m.CostRank || 0), 10);\n\n // Update filter ranges based on actual max values\n this.powerRankRange = { min: 0, max: this.maxPowerRank };\n this.speedRankRange = { min: 0, max: this.maxSpeedRank };\n this.costRankRange = { min: 0, max: this.maxCostRank };\n\n this.filteredModels = [...this.models];\n this.sortModels();\n this.applyFilters();\n } catch (error) {\n console.error('Error loading model data:', error);\n this.sharedService.CreateSimpleNotification('Error loading models', 'error', 3000);\n } finally {\n this.isLoading = false;\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }\n }\n\n public formatRank(rank: number | null, rankType?: 'power' | 'speed' | 'cost'): string {\n if (rank === null) return 'N/A';\n \n // Determine which max value to use\n let maxValue = 10;\n if (rankType === 'power') {\n maxValue = this.maxPowerRank;\n } else if (rankType === 'speed') {\n maxValue = this.maxSpeedRank;\n } else if (rankType === 'cost') {\n maxValue = this.maxCostRank;\n }\n \n return `${rank}/${maxValue}`;\n }\n\n private applyInitialState(state: any): void {\n if (state.viewMode) this.viewMode = state.viewMode;\n if (state.showFilters !== undefined) this.showFilters = state.showFilters;\n if (state.searchTerm) this.searchTerm = state.searchTerm;\n if (state.selectedVendor) this.selectedVendor = state.selectedVendor;\n if (state.selectedType) this.selectedType = state.selectedType;\n if (state.selectedStatus) this.selectedStatus = state.selectedStatus;\n if (state.sortBy) this.sortBy = state.sortBy;\n if (state.powerRankRange) this.powerRankRange = state.powerRankRange;\n if (state.speedRankRange) this.speedRankRange = state.speedRankRange;\n if (state.costRankRange) this.costRankRange = state.costRankRange;\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public toggleFilters(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleFilterPanel(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public setViewMode(mode: 'grid' | 'list'): void {\n this.viewMode = mode;\n this.expandedModelId = null;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleModelExpansion(modelId: string): void {\n this.expandedModelId = this.expandedModelId === modelId ? null : modelId;\n }\n\n public applyFilters(): void {\n this.filteredModels = this.models.filter(m => {\n const model = m as ModelDisplayData;\n // Search filter\n if (this.searchTerm) {\n const searchLower = this.searchTerm.toLowerCase();\n const matchesSearch = \n model.Name?.toLowerCase().includes(searchLower) ||\n model.Description?.toLowerCase().includes(searchLower) ||\n model.VendorName?.toLowerCase().includes(searchLower) ||\n model.ModelTypeName?.toLowerCase().includes(searchLower);\n \n if (!matchesSearch) return false;\n }\n\n // Vendor filter\n if (this.selectedVendor !== 'all' && !UUIDsEqual(model.VendorID, this.selectedVendor)) {\n return false;\n }\n\n // Type filter\n if (this.selectedType !== 'all' && !UUIDsEqual(model.AIModelTypeID, this.selectedType)) {\n return false;\n }\n\n // Status filter\n if (this.selectedStatus !== 'all') {\n const isActive = model.IsActive === true;\n if (this.selectedStatus === 'active' && !isActive) return false;\n if (this.selectedStatus === 'inactive' && isActive) return false;\n }\n\n // Rank filters\n if (model.PowerRank !== null && (model.PowerRank < this.powerRankRange.min || model.PowerRank > this.powerRankRange.max)) {\n return false;\n }\n if (model.SpeedRank !== null && (model.SpeedRank < this.speedRankRange.min || model.SpeedRank > this.speedRankRange.max)) {\n return false;\n }\n if (model.CostRank !== null && (model.CostRank < this.costRankRange.min || model.CostRank > this.costRankRange.max)) {\n return false;\n }\n\n return true;\n });\n\n this.sortModels();\n }\n\n private sortModels(): void {\n this.filteredModels.sort((a, b) => {\n const modelA = a as ModelDisplayData;\n const modelB = b as ModelDisplayData;\n let comparison = 0;\n\n switch (this.sortBy) {\n case 'name':\n comparison = (modelA.Name || '').localeCompare(modelB.Name || '');\n break;\n case 'vendor':\n comparison = (modelA.VendorName || '').localeCompare(modelB.VendorName || '');\n break;\n case 'type':\n comparison = (modelA.ModelTypeName || '').localeCompare(modelB.ModelTypeName || '');\n break;\n case 'powerRank':\n comparison = (modelA.PowerRank || 0) - (modelB.PowerRank || 0);\n break;\n case 'speedRank':\n comparison = (modelA.SpeedRank || 0) - (modelB.SpeedRank || 0);\n break;\n case 'costRank':\n comparison = (modelA.CostRank || 0) - (modelB.CostRank || 0);\n break;\n case 'created':\n comparison = new Date(modelA.__mj_CreatedAt).getTime() - new Date(modelB.__mj_CreatedAt).getTime();\n break;\n case 'updated':\n comparison = new Date(modelA.__mj_UpdatedAt).getTime() - new Date(modelB.__mj_UpdatedAt).getTime();\n break;\n default:\n comparison = 0;\n }\n\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n public onVendorChange(vendorId: string): void {\n this.selectedVendor = vendorId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onTypeChange(typeId: string): void {\n this.selectedType = typeId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusChange(status: string): void {\n this.selectedStatus = status;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onSortChange(sortBy: string): void {\n if (this.sortBy === sortBy) {\n // Toggle direction if same column\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New column, default to ascending\n this.sortBy = sortBy;\n this.sortDirection = 'asc';\n }\n this.sortModels();\n this.saveUserPreferencesDebounced();\n }\n\n public async toggleModelStatus(model: ModelDisplayData, event: Event): Promise<void> {\n event.stopPropagation();\n \n try {\n model.IsActive = !model.IsActive;\n if (await model.Save()) {\n this.sharedService.CreateSimpleNotification(\n `Model ${model.IsActive ? 'activated' : 'deactivated'} successfully`,\n 'success',\n 3000\n );\n } else {\n // Revert on failure\n model.IsActive = !model.IsActive;\n throw new Error('Failed to save model status');\n }\n } catch (error) {\n console.error('Error toggling model status:', error);\n this.sharedService.CreateSimpleNotification('Error updating model status', 'error', 3000);\n }\n }\n\n public openModel(modelId: string): void {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: modelId }]);\n this.navigationService.OpenEntityRecord('MJ: AI Models', compositeKey);\n }\n\n /**\n * Show the detail panel for a model\n */\n public showModelDetails(model: MJAIModelEntityExtended, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedModel = model as ModelDisplayData;\n this.detailPanelVisible = true;\n }\n\n /**\n * Close the detail panel\n */\n public closeDetailPanel(): void {\n this.detailPanelVisible = false;\n // Delay clearing selectedModel for smoother animation\n setTimeout(() => {\n if (!this.detailPanelVisible) {\n this.selectedModel = null;\n }\n }, 300);\n }\n\n /**\n * Open the full entity record from the detail panel\n */\n public openModelFromPanel(): void {\n if (this.selectedModel) {\n this.openModel(this.selectedModel.ID);\n }\n }\n\n public async createNewModel(): Promise<void> {\n try {\n const md = new Metadata();\n const newModel = await md.GetEntityObject<MJAIModelEntityExtended>('MJ: AI Models');\n \n if (newModel) {\n newModel.Name = 'New AI Model';\n newModel.IsActive = true;\n \n if (await newModel.Save()) {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: newModel.ID }]);\n this.navigationService.OpenEntityRecord('MJ: AI Models', compositeKey);\n\n // Reload the data\n await this.loadInitialData();\n }\n }\n } catch (error) {\n console.error('Error creating new model:', error);\n this.sharedService.CreateSimpleNotification('Error creating model', 'error', 3000);\n }\n }\n\n public getModelIcon(model: ModelDisplayData): string {\n const typeName = model.ModelTypeName?.toLowerCase();\n if (typeName?.includes('chat') || typeName?.includes('conversation')) {\n return 'fa-solid fa-comments';\n } else if (typeName?.includes('image') || typeName?.includes('vision')) {\n return 'fa-solid fa-image';\n } else if (typeName?.includes('audio') || typeName?.includes('speech')) {\n return 'fa-solid fa-microphone';\n } else if (typeName?.includes('embed')) {\n return 'fa-solid fa-vector-square';\n }\n return 'fa-solid fa-microchip';\n }\n\n public getRankClass(rank: number | null, rankType?: 'power' | 'speed' | 'cost'): string {\n if (rank === null || rank === 0) return 'rank-none';\n \n // Determine which max value to use\n let maxValue = 10;\n if (rankType === 'power') {\n maxValue = this.maxPowerRank;\n } else if (rankType === 'speed') {\n maxValue = this.maxSpeedRank;\n } else if (rankType === 'cost') {\n maxValue = this.maxCostRank;\n }\n \n // Calculate percentage of max\n const percentage = (rank / maxValue) * 100;\n \n if (percentage >= 70) return 'rank-high';\n if (percentage >= 40) return 'rank-medium';\n return 'rank-low';\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchTerm !== '' || \n this.selectedVendor !== 'all' || \n this.selectedType !== 'all' || \n this.selectedStatus !== 'all' ||\n this.powerRankRange.min > 0 ||\n this.powerRankRange.max < this.maxPowerRank ||\n this.speedRankRange.min > 0 ||\n this.speedRankRange.max < this.maxSpeedRank ||\n this.costRankRange.min > 0 ||\n this.costRankRange.max < this.maxCostRank;\n }\n\n public clearFilters(): void {\n this.searchTerm = '';\n this.selectedVendor = 'all';\n this.selectedType = 'all';\n this.selectedStatus = 'all';\n this.powerRankRange = { min: 0, max: this.maxPowerRank };\n this.speedRankRange = { min: 0, max: this.maxSpeedRank };\n this.costRankRange = { min: 0, max: this.maxCostRank };\n this.searchSubject.next('');\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public formatTokenLimit(limit: number): string {\n if (limit >= 1000000) {\n return Math.floor(limit / 1000000) + 'M';\n } else if (limit >= 1000) {\n return Math.floor(limit / 1000) + 'K';\n }\n return limit.toString();\n }\n\n public validateAndApplyRankFilters(rankType: 'power' | 'speed' | 'cost'): void {\n // Get the appropriate range and max value based on type\n let range = rankType === 'power' ? this.powerRankRange :\n rankType === 'speed' ? this.speedRankRange :\n this.costRankRange;\n\n let maxValue = rankType === 'power' ? this.maxPowerRank :\n rankType === 'speed' ? this.maxSpeedRank :\n this.maxCostRank;\n\n // Ensure min is not greater than max\n if (range.min > range.max) {\n // Swap the values\n const temp = range.min;\n range.min = range.max;\n range.max = temp;\n }\n\n // Ensure values are within bounds\n range.min = Math.max(0, Math.min(maxValue, range.min));\n range.max = Math.max(0, Math.min(maxValue, range.max));\n\n // Apply the filters\n this.applyFilters();\n }\n\n // BaseResourceComponent abstract method implementations\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Models';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-microchip';\n }\n}","<div class=\"model-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n AI Models\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredModels.length }} models</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewModel()\"\n title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Model Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredModels.length }}</span>\n <span class=\"summary-label\">of {{ models.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search models...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Sort By Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sort\"></span>\n Sort By\n </label>\n <select class=\"filter-select\" [value]=\"sortBy\" (change)=\"onSortChange($any($event.target).value)\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n\n <!-- Vendor Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-building\"></span>\n Vendor\n </label>\n <select class=\"filter-select\" [value]=\"selectedVendor\" (change)=\"onVendorChange($any($event.target).value)\">\n <option value=\"all\">All Vendors</option>\n @for (vendor of vendors; track vendor.ID) {\n <option [value]=\"vendor.ID\">{{ vendor.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-microchip\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Power Rank Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-bolt\"></span>\n Power Rank\n </label>\n <div class=\"rank-filter-inputs\">\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\"\n />\n <span class=\"rank-separator\">-</span>\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\"\n />\n </div>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"model-info\">\n <div class=\"model-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"model-details\">\n <h4 class=\"model-name\" [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></h4>\n <div class=\"model-meta\">\n @if (model.Vendor) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-building\"></i>\n {{ model.Vendor }}\n </span>\n }\n @if (model.AIModelType) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.AIModelType }}\n </span>\n }\n @if (model.IsActive) {\n <span class=\"meta-item status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"meta-item status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (model.Description) {\n <p class=\"model-description\" [innerHTML]=\"model.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"model-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedModelId === model.ID) {\n <div class=\"expanded-content\">\n <div class=\"model-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Power Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.PowerRank, 'power') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Speed Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.SpeedRank, 'speed') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Cost Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.CostRank, 'cost') }}</span>\n </div>\n @if (model.InputTokenLimit) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Token Limit</span>\n <span class=\"stat-value\">{{ formatTokenLimit(model.InputTokenLimit) }}</span>\n </div>\n }\n @if (model.APIName) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName }}</span>\n </div>\n }\n @if (model.DriverClass) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showModelDetails(model, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th (click)=\"onSortChange('name')\"\n [class.sorted]=\"sortBy === 'name'\"\n [class.desc]=\"sortBy === 'name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('vendor')\"\n [class.sorted]=\"sortBy === 'vendor'\"\n [class.desc]=\"sortBy === 'vendor' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Vendor\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('type')\"\n [class.sorted]=\"sortBy === 'type'\"\n [class.desc]=\"sortBy === 'type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('powerRank')\"\n [class.sorted]=\"sortBy === 'powerRank'\"\n [class.desc]=\"sortBy === 'powerRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Power\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('speedRank')\"\n [class.sorted]=\"sortBy === 'speedRank'\"\n [class.desc]=\"sortBy === 'speedRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Speed\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('costRank')\"\n [class.sorted]=\"sortBy === 'costRank'\"\n [class.desc]=\"sortBy === 'costRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Cost\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n <span [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></span>\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"showModelDetails(model)\" title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedModel) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getModelIcon(selectedModel)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedModel.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedModel.Vendor || 'AI Model' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n @if (selectedModel.IsActive) {\n <span class=\"status-badge status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"status-badge status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n @if (selectedModel.AIModelType) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ selectedModel.AIModelType }}\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedModel.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedModel.Description }}</p>\n </div>\n }\n\n <!-- Ranking Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n Rankings\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.PowerRank, 'power')\">\n {{ formatRank(selectedModel.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Speed Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.SpeedRank, 'speed')\">\n {{ formatRank(selectedModel.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Cost Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.CostRank, 'cost')\">\n {{ formatRank(selectedModel.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Vendor</span>\n <span class=\"detail-value\">{{ selectedModel.Vendor || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Model Type</span>\n <span class=\"detail-value\">{{ selectedModel.AIModelType || 'Unknown' }}</span>\n </div>\n @if (selectedModel.APIName) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">API Name</span>\n <span class=\"detail-value\">{{ selectedModel.APIName }}</span>\n </div>\n }\n @if (selectedModel.InputTokenLimit) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Input Token Limit</span>\n <span class=\"detail-value\">{{ formatTokenLimit(selectedModel.InputTokenLimit) }}</span>\n </div>\n }\n @if (selectedModel.SupportedResponseFormats) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Formats</span>\n <span class=\"detail-value\">{{ selectedModel.SupportedResponseFormats }}</span>\n </div>\n }\n @if (selectedModel.SupportsEffortLevel) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Supports Effort Level</span>\n <span class=\"detail-value\">Yes</span>\n </div>\n }\n @if (selectedModel.DriverClass) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Driver Class</span>\n <span class=\"detail-value\">{{ selectedModel.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openModelFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n }\n</div>"]}
1
+ {"version":3,"file":"model-management.component.js","sourceRoot":"","sources":["../../../../src/AI/components/models/model-management.component.ts","../../../../src/AI/components/models/model-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { MJAIVendorEntity, MJAIModelTypeEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseEntity, BaseEntityEvent, Metadata, CompositeKey } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { SharedService, BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RegisterClass, UUIDsEqual, MJGlobal, MJEventType } from '@memberjunction/global';\nimport { MJAIModelEntityExtended } from '@memberjunction/ai-core-plus';\n\ninterface ModelDisplayData extends MJAIModelEntityExtended {\n VendorName?: string;\n VendorID?: string; // Add this since we're using it for filtering\n ModelTypeName?: string;\n PowerRankDisplay?: string;\n SpeedRankDisplay?: string;\n CostRankDisplay?: string;\n}\n\n/**\n * User preferences for the Model Management dashboard\n */\ninterface ModelManagementUserPreferences {\n viewMode: 'grid' | 'list';\n showFilters: boolean;\n searchTerm: string;\n selectedVendor: string;\n selectedType: string;\n selectedStatus: string;\n sortBy: string;\n sortDirection: 'asc' | 'desc';\n}\n\n/**\n * AI Models Resource - displays AI model management\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIModelsResource')\n@Component({\n standalone: false,\n selector: 'app-model-management',\n templateUrl: './model-management.component.html',\n styleUrls: ['./model-management.component.css']\n})\nexport class ModelManagementComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'AI.Models.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n // View state\n public viewMode: 'grid' | 'list' = 'grid';\n public isLoading = true;\n public showFilters = true;\n public expandedModelId: string | null = null;\n\n // Data - Keep as MJAIModelEntityExtended to preserve getters\n public models: MJAIModelEntityExtended[] = [];\n public filteredModels: MJAIModelEntityExtended[] = [];\n public vendors: MJAIVendorEntity[] = [];\n public modelTypes: MJAIModelTypeEntity[] = [];\n\n // Filtering\n public searchTerm = '';\n private searchSubject = new BehaviorSubject<string>('');\n public selectedVendor = 'all';\n public selectedType = 'all';\n public selectedStatus = 'all';\n public powerRankRange = { min: 0, max: 10 };\n public speedRankRange = { min: 0, max: 10 };\n public costRankRange = { min: 0, max: 10 };\n\n // Detail panel\n public selectedModel: ModelDisplayData | null = null;\n public detailPanelVisible = false;\n\n // Sorting\n public sortBy = 'name';\n public sortDirection: 'asc' | 'desc' = 'asc';\n public sortOptions = [\n { value: 'name', label: 'Name' },\n { value: 'vendor', label: 'Vendor' },\n { value: 'type', label: 'Type' },\n { value: 'powerRank', label: 'Power Rank' },\n { value: 'speedRank', label: 'Speed Rank' },\n { value: 'costRank', label: 'Cost Rank' },\n { value: 'created', label: 'Created Date' },\n { value: 'updated', label: 'Updated Date' }\n ];\n\n // Max rank values calculated from all models\n public maxPowerRank = 10;\n public maxSpeedRank = 10;\n public maxCostRank = 10;\n\n // Loading messages\n public loadingMessages = [\n 'Loading AI models...',\n 'Fetching vendor information...',\n 'Calculating rankings...',\n 'Almost ready...'\n ];\n public currentLoadingMessage = this.loadingMessages[0];\n private loadingMessageIndex = 0;\n private loadingMessageInterval: any;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private sharedService: SharedService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n ngOnInit(): void {\n // Load saved user preferences first\n this.loadUserPreferences();\n\n this.setupSearchListener();\n this.startLoadingMessages();\n this.loadInitialData();\n\n // Apply initial state from resource configuration if provided (overrides saved prefs)\n if (this.Data?.Configuration) {\n this.applyInitialState(this.Data.Configuration);\n }\n\n // Subscribe to remote cache invalidation events for real-time updates\n this.subscribeToCacheInvalidation();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n }\n\n private subscribeToCacheInvalidation(): void {\n MJGlobal.Instance.GetEventListener(true)\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode) return;\n const beEvent = event.args as BaseEntityEvent;\n if (beEvent.type !== 'remote-invalidate') return;\n const entityName = beEvent.entityName?.toLowerCase().trim();\n if (entityName === 'mj: ai models' || entityName === 'mj: ai model types') {\n console.log(`[AI Models Dashboard] Remote invalidation for \"${beEvent.entityName}\" — refreshing`);\n // Small delay to let BaseEngine finish its LoadSingleConfig network call\n setTimeout(() => this.refreshDataFromEngine(), 500);\n }\n });\n }\n\n private refreshDataFromEngine(): void {\n const models = AIEngineBase.Instance.Models;\n this.vendors = AIEngineBase.Instance.Vendors;\n this.modelTypes = AIEngineBase.Instance.ModelTypes;\n\n const vendorMap = new Map(this.vendors.map(v => [v.ID, v.Name]));\n const typeMap = new Map(this.modelTypes.map(t => [t.ID, t.Name]));\n\n this.models = models.map((model) => {\n let vendorId: string | undefined;\n if (model.Vendor) {\n const vendor = this.vendors.find(v => v.Name === model.Vendor);\n vendorId = vendor?.ID;\n }\n const modelWithDisplay = model as ModelDisplayData;\n modelWithDisplay.VendorID = vendorId;\n modelWithDisplay.VendorName = model.Vendor || 'No Vendor';\n modelWithDisplay.ModelTypeName = model.AIModelTypeID ? typeMap.get(model.AIModelTypeID) || 'Unknown' : 'No Type';\n return model;\n });\n\n this.filteredModels = [...this.models];\n this.sortModels();\n this.applyFilters();\n this.cdr.detectChanges();\n }\n\n private setupSearchListener(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(searchTerm => {\n this.searchTerm = searchTerm;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n });\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as ModelManagementUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[ModelManagement] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: ModelManagementUserPreferences): void {\n if (prefs.viewMode) {\n this.viewMode = prefs.viewMode;\n }\n if (prefs.showFilters !== undefined) {\n this.showFilters = prefs.showFilters;\n }\n if (prefs.searchTerm) {\n this.searchTerm = prefs.searchTerm;\n }\n if (prefs.selectedVendor) {\n this.selectedVendor = prefs.selectedVendor;\n }\n if (prefs.selectedType) {\n this.selectedType = prefs.selectedType;\n }\n if (prefs.selectedStatus) {\n this.selectedStatus = prefs.selectedStatus;\n }\n if (prefs.sortBy) {\n this.sortBy = prefs.sortBy;\n }\n if (prefs.sortDirection) {\n this.sortDirection = prefs.sortDirection;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): ModelManagementUserPreferences {\n return {\n viewMode: this.viewMode,\n showFilters: this.showFilters,\n searchTerm: this.searchTerm,\n selectedVendor: this.selectedVendor,\n selectedType: this.selectedType,\n selectedStatus: this.selectedStatus,\n sortBy: this.sortBy,\n sortDirection: this.sortDirection\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[ModelManagement] Failed to persist user preferences:', error);\n }\n }\n\n private startLoadingMessages(): void {\n this.loadingMessageInterval = setInterval(() => {\n this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];\n }, 2000);\n }\n\n private async loadInitialData(): Promise<void> {\n try {\n // Ensure AIEngineBase is configured (no-op if already loaded)\n await AIEngineBase.Instance.Config(false);\n\n // Get cached data from AIEngineBase\n const models = AIEngineBase.Instance.Models;\n this.vendors = AIEngineBase.Instance.Vendors;\n this.modelTypes = AIEngineBase.Instance.ModelTypes;\n \n // Log summary data\n \n // Create lookup maps\n const vendorMap = new Map(this.vendors.map(v => [v.ID, v.Name]));\n const typeMap = new Map(this.modelTypes.map(t => [t.ID, t.Name]));\n\n // Transform models to display format\n this.models = models.map((model) => {\n \n // Find vendor ID by matching vendor name\n let vendorId: string | undefined;\n if (model.Vendor) {\n const vendor = this.vendors.find(v => v.Name === model.Vendor);\n vendorId = vendor?.ID;\n }\n \n // Don't spread the model - it loses getter properties!\n // Instead, augment the model with display properties\n const modelWithDisplay = model as ModelDisplayData;\n modelWithDisplay.VendorID = vendorId;\n modelWithDisplay.VendorName = model.Vendor || 'No Vendor';\n modelWithDisplay.ModelTypeName = model.AIModelTypeID ? typeMap.get(model.AIModelTypeID) || 'Unknown' : 'No Type';\n \n return model;\n });\n\n // Calculate max values for each rank type from ALL models\n this.maxPowerRank = Math.max(...this.models.map(m => m.PowerRank || 0), 10);\n this.maxSpeedRank = Math.max(...this.models.map(m => m.SpeedRank || 0), 10);\n this.maxCostRank = Math.max(...this.models.map(m => m.CostRank || 0), 10);\n\n // Update filter ranges based on actual max values\n this.powerRankRange = { min: 0, max: this.maxPowerRank };\n this.speedRankRange = { min: 0, max: this.maxSpeedRank };\n this.costRankRange = { min: 0, max: this.maxCostRank };\n\n this.filteredModels = [...this.models];\n this.sortModels();\n this.applyFilters();\n } catch (error) {\n console.error('Error loading model data:', error);\n this.sharedService.CreateSimpleNotification('Error loading models', 'error', 3000);\n } finally {\n this.isLoading = false;\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }\n }\n\n public formatRank(rank: number | null, rankType?: 'power' | 'speed' | 'cost'): string {\n if (rank === null) return 'N/A';\n \n // Determine which max value to use\n let maxValue = 10;\n if (rankType === 'power') {\n maxValue = this.maxPowerRank;\n } else if (rankType === 'speed') {\n maxValue = this.maxSpeedRank;\n } else if (rankType === 'cost') {\n maxValue = this.maxCostRank;\n }\n \n return `${rank}/${maxValue}`;\n }\n\n private applyInitialState(state: any): void {\n if (state.viewMode) this.viewMode = state.viewMode;\n if (state.showFilters !== undefined) this.showFilters = state.showFilters;\n if (state.searchTerm) this.searchTerm = state.searchTerm;\n if (state.selectedVendor) this.selectedVendor = state.selectedVendor;\n if (state.selectedType) this.selectedType = state.selectedType;\n if (state.selectedStatus) this.selectedStatus = state.selectedStatus;\n if (state.sortBy) this.sortBy = state.sortBy;\n if (state.powerRankRange) this.powerRankRange = state.powerRankRange;\n if (state.speedRankRange) this.speedRankRange = state.speedRankRange;\n if (state.costRankRange) this.costRankRange = state.costRankRange;\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public toggleFilters(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleFilterPanel(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public setViewMode(mode: 'grid' | 'list'): void {\n this.viewMode = mode;\n this.expandedModelId = null;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleModelExpansion(modelId: string): void {\n this.expandedModelId = this.expandedModelId === modelId ? null : modelId;\n }\n\n public applyFilters(): void {\n this.filteredModels = this.models.filter(m => {\n const model = m as ModelDisplayData;\n // Search filter\n if (this.searchTerm) {\n const searchLower = this.searchTerm.toLowerCase();\n const matchesSearch = \n model.Name?.toLowerCase().includes(searchLower) ||\n model.Description?.toLowerCase().includes(searchLower) ||\n model.VendorName?.toLowerCase().includes(searchLower) ||\n model.ModelTypeName?.toLowerCase().includes(searchLower);\n \n if (!matchesSearch) return false;\n }\n\n // Vendor filter\n if (this.selectedVendor !== 'all' && !UUIDsEqual(model.VendorID, this.selectedVendor)) {\n return false;\n }\n\n // Type filter\n if (this.selectedType !== 'all' && !UUIDsEqual(model.AIModelTypeID, this.selectedType)) {\n return false;\n }\n\n // Status filter\n if (this.selectedStatus !== 'all') {\n const isActive = model.IsActive === true;\n if (this.selectedStatus === 'active' && !isActive) return false;\n if (this.selectedStatus === 'inactive' && isActive) return false;\n }\n\n // Rank filters\n if (model.PowerRank !== null && (model.PowerRank < this.powerRankRange.min || model.PowerRank > this.powerRankRange.max)) {\n return false;\n }\n if (model.SpeedRank !== null && (model.SpeedRank < this.speedRankRange.min || model.SpeedRank > this.speedRankRange.max)) {\n return false;\n }\n if (model.CostRank !== null && (model.CostRank < this.costRankRange.min || model.CostRank > this.costRankRange.max)) {\n return false;\n }\n\n return true;\n });\n\n this.sortModels();\n }\n\n private sortModels(): void {\n this.filteredModels.sort((a, b) => {\n const modelA = a as ModelDisplayData;\n const modelB = b as ModelDisplayData;\n let comparison = 0;\n\n switch (this.sortBy) {\n case 'name':\n comparison = (modelA.Name || '').localeCompare(modelB.Name || '');\n break;\n case 'vendor':\n comparison = (modelA.VendorName || '').localeCompare(modelB.VendorName || '');\n break;\n case 'type':\n comparison = (modelA.ModelTypeName || '').localeCompare(modelB.ModelTypeName || '');\n break;\n case 'powerRank':\n comparison = (modelA.PowerRank || 0) - (modelB.PowerRank || 0);\n break;\n case 'speedRank':\n comparison = (modelA.SpeedRank || 0) - (modelB.SpeedRank || 0);\n break;\n case 'costRank':\n comparison = (modelA.CostRank || 0) - (modelB.CostRank || 0);\n break;\n case 'created':\n comparison = new Date(modelA.__mj_CreatedAt).getTime() - new Date(modelB.__mj_CreatedAt).getTime();\n break;\n case 'updated':\n comparison = new Date(modelA.__mj_UpdatedAt).getTime() - new Date(modelB.__mj_UpdatedAt).getTime();\n break;\n default:\n comparison = 0;\n }\n\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n public onVendorChange(vendorId: string): void {\n this.selectedVendor = vendorId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onTypeChange(typeId: string): void {\n this.selectedType = typeId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusChange(status: string): void {\n this.selectedStatus = status;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onSortChange(sortBy: string): void {\n if (this.sortBy === sortBy) {\n // Toggle direction if same column\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New column, default to ascending\n this.sortBy = sortBy;\n this.sortDirection = 'asc';\n }\n this.sortModels();\n this.saveUserPreferencesDebounced();\n }\n\n public async toggleModelStatus(model: ModelDisplayData, event: Event): Promise<void> {\n event.stopPropagation();\n \n try {\n model.IsActive = !model.IsActive;\n if (await model.Save()) {\n this.sharedService.CreateSimpleNotification(\n `Model ${model.IsActive ? 'activated' : 'deactivated'} successfully`,\n 'success',\n 3000\n );\n } else {\n // Revert on failure\n model.IsActive = !model.IsActive;\n throw new Error('Failed to save model status');\n }\n } catch (error) {\n console.error('Error toggling model status:', error);\n this.sharedService.CreateSimpleNotification('Error updating model status', 'error', 3000);\n }\n }\n\n public openModel(modelId: string): void {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: modelId }]);\n this.navigationService.OpenEntityRecord('MJ: AI Models', compositeKey);\n }\n\n /**\n * Show the detail panel for a model\n */\n public showModelDetails(model: MJAIModelEntityExtended, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedModel = model as ModelDisplayData;\n this.detailPanelVisible = true;\n }\n\n /**\n * Close the detail panel\n */\n public closeDetailPanel(): void {\n this.detailPanelVisible = false;\n // Delay clearing selectedModel for smoother animation\n setTimeout(() => {\n if (!this.detailPanelVisible) {\n this.selectedModel = null;\n }\n }, 300);\n }\n\n /**\n * Open the full entity record from the detail panel\n */\n public openModelFromPanel(): void {\n if (this.selectedModel) {\n this.openModel(this.selectedModel.ID);\n }\n }\n\n public async createNewModel(): Promise<void> {\n try {\n const md = new Metadata();\n const newModel = await md.GetEntityObject<MJAIModelEntityExtended>('MJ: AI Models');\n \n if (newModel) {\n newModel.Name = 'New AI Model';\n newModel.IsActive = true;\n \n if (await newModel.Save()) {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: newModel.ID }]);\n this.navigationService.OpenEntityRecord('MJ: AI Models', compositeKey);\n\n // Reload the data\n await this.loadInitialData();\n }\n }\n } catch (error) {\n console.error('Error creating new model:', error);\n this.sharedService.CreateSimpleNotification('Error creating model', 'error', 3000);\n }\n }\n\n public getModelIcon(model: ModelDisplayData): string {\n const typeName = model.ModelTypeName?.toLowerCase();\n if (typeName?.includes('chat') || typeName?.includes('conversation')) {\n return 'fa-solid fa-comments';\n } else if (typeName?.includes('image') || typeName?.includes('vision')) {\n return 'fa-solid fa-image';\n } else if (typeName?.includes('audio') || typeName?.includes('speech')) {\n return 'fa-solid fa-microphone';\n } else if (typeName?.includes('embed')) {\n return 'fa-solid fa-vector-square';\n }\n return 'fa-solid fa-microchip';\n }\n\n public getRankClass(rank: number | null, rankType?: 'power' | 'speed' | 'cost'): string {\n if (rank === null || rank === 0) return 'rank-none';\n \n // Determine which max value to use\n let maxValue = 10;\n if (rankType === 'power') {\n maxValue = this.maxPowerRank;\n } else if (rankType === 'speed') {\n maxValue = this.maxSpeedRank;\n } else if (rankType === 'cost') {\n maxValue = this.maxCostRank;\n }\n \n // Calculate percentage of max\n const percentage = (rank / maxValue) * 100;\n \n if (percentage >= 70) return 'rank-high';\n if (percentage >= 40) return 'rank-medium';\n return 'rank-low';\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchTerm !== '' || \n this.selectedVendor !== 'all' || \n this.selectedType !== 'all' || \n this.selectedStatus !== 'all' ||\n this.powerRankRange.min > 0 ||\n this.powerRankRange.max < this.maxPowerRank ||\n this.speedRankRange.min > 0 ||\n this.speedRankRange.max < this.maxSpeedRank ||\n this.costRankRange.min > 0 ||\n this.costRankRange.max < this.maxCostRank;\n }\n\n public clearFilters(): void {\n this.searchTerm = '';\n this.selectedVendor = 'all';\n this.selectedType = 'all';\n this.selectedStatus = 'all';\n this.powerRankRange = { min: 0, max: this.maxPowerRank };\n this.speedRankRange = { min: 0, max: this.maxSpeedRank };\n this.costRankRange = { min: 0, max: this.maxCostRank };\n this.searchSubject.next('');\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public formatTokenLimit(limit: number): string {\n if (limit >= 1000000) {\n return Math.floor(limit / 1000000) + 'M';\n } else if (limit >= 1000) {\n return Math.floor(limit / 1000) + 'K';\n }\n return limit.toString();\n }\n\n public validateAndApplyRankFilters(rankType: 'power' | 'speed' | 'cost'): void {\n // Get the appropriate range and max value based on type\n let range = rankType === 'power' ? this.powerRankRange :\n rankType === 'speed' ? this.speedRankRange :\n this.costRankRange;\n\n let maxValue = rankType === 'power' ? this.maxPowerRank :\n rankType === 'speed' ? this.maxSpeedRank :\n this.maxCostRank;\n\n // Ensure min is not greater than max\n if (range.min > range.max) {\n // Swap the values\n const temp = range.min;\n range.min = range.max;\n range.max = temp;\n }\n\n // Ensure values are within bounds\n range.min = Math.max(0, Math.min(maxValue, range.min));\n range.max = Math.max(0, Math.min(maxValue, range.max));\n\n // Apply the filters\n this.applyFilters();\n }\n\n // BaseResourceComponent abstract method implementations\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Models';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-microchip';\n }\n}","<div class=\"model-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n AI Models\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredModels.length }} models</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewModel()\"\n title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n </div>\n\n <kendo-splitter orientation=\"horizontal\">\n @if (showFilters) {\n <kendo-splitter-pane size=\"320\" min=\"250\" max=\"400\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Model Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredModels.length }}</span>\n <span class=\"summary-label\">of {{ models.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search models...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Sort By Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sort\"></span>\n Sort By\n </label>\n <select class=\"filter-select\" [value]=\"sortBy\" (change)=\"onSortChange($any($event.target).value)\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n\n <!-- Vendor Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-building\"></span>\n Vendor\n </label>\n <select class=\"filter-select\" [value]=\"selectedVendor\" (change)=\"onVendorChange($any($event.target).value)\">\n <option value=\"all\">All Vendors</option>\n @for (vendor of vendors; track vendor.ID) {\n <option [value]=\"vendor.ID\">{{ vendor.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-microchip\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Power Rank Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-bolt\"></span>\n Power Rank\n </label>\n <div class=\"rank-filter-inputs\">\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\"\n />\n <span class=\"rank-separator\">-</span>\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\"\n />\n </div>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n }\n\n <kendo-splitter-pane>\n <div class=\"content-area\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"model-info\">\n <div class=\"model-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"model-details\">\n <h4 class=\"model-name\" [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></h4>\n <div class=\"model-meta\">\n @if (model.Vendor) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-building\"></i>\n {{ model.Vendor }}\n </span>\n }\n @if (model.AIModelType) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.AIModelType }}\n </span>\n }\n @if (model.IsActive) {\n <span class=\"meta-item status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"meta-item status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (model.Description) {\n <p class=\"model-description\" [innerHTML]=\"model.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"model-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedModelId === model.ID) {\n <div class=\"expanded-content\">\n <div class=\"model-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Power Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.PowerRank, 'power') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Speed Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.SpeedRank, 'speed') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Cost Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.CostRank, 'cost') }}</span>\n </div>\n @if (model.InputTokenLimit) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Token Limit</span>\n <span class=\"stat-value\">{{ formatTokenLimit(model.InputTokenLimit) }}</span>\n </div>\n }\n @if (model.APIName) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName }}</span>\n </div>\n }\n @if (model.DriverClass) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showModelDetails(model, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th (click)=\"onSortChange('name')\"\n [class.sorted]=\"sortBy === 'name'\"\n [class.desc]=\"sortBy === 'name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('vendor')\"\n [class.sorted]=\"sortBy === 'vendor'\"\n [class.desc]=\"sortBy === 'vendor' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Vendor\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('type')\"\n [class.sorted]=\"sortBy === 'type'\"\n [class.desc]=\"sortBy === 'type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('powerRank')\"\n [class.sorted]=\"sortBy === 'powerRank'\"\n [class.desc]=\"sortBy === 'powerRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Power\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('speedRank')\"\n [class.sorted]=\"sortBy === 'speedRank'\"\n [class.desc]=\"sortBy === 'speedRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Speed\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('costRank')\"\n [class.sorted]=\"sortBy === 'costRank'\"\n [class.desc]=\"sortBy === 'costRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Cost\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n <span [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></span>\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"showModelDetails(model)\" title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedModel) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getModelIcon(selectedModel)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedModel.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedModel.Vendor || 'AI Model' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n @if (selectedModel.IsActive) {\n <span class=\"status-badge status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"status-badge status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n @if (selectedModel.AIModelType) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ selectedModel.AIModelType }}\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedModel.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedModel.Description }}</p>\n </div>\n }\n\n <!-- Ranking Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n Rankings\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.PowerRank, 'power')\">\n {{ formatRank(selectedModel.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Speed Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.SpeedRank, 'speed')\">\n {{ formatRank(selectedModel.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Cost Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.CostRank, 'cost')\">\n {{ formatRank(selectedModel.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Vendor</span>\n <span class=\"detail-value\">{{ selectedModel.Vendor || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Model Type</span>\n <span class=\"detail-value\">{{ selectedModel.AIModelType || 'Unknown' }}</span>\n </div>\n @if (selectedModel.APIName) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">API Name</span>\n <span class=\"detail-value\">{{ selectedModel.APIName }}</span>\n </div>\n }\n @if (selectedModel.InputTokenLimit) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Input Token Limit</span>\n <span class=\"detail-value\">{{ formatTokenLimit(selectedModel.InputTokenLimit) }}</span>\n </div>\n }\n @if (selectedModel.SupportedResponseFormats) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Formats</span>\n <span class=\"detail-value\">{{ selectedModel.SupportedResponseFormats }}</span>\n </div>\n }\n @if (selectedModel.SupportsEffortLevel) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Supports Effort Level</span>\n <span class=\"detail-value\">Yes</span>\n </div>\n }\n @if (selectedModel.DriverClass) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Driver Class</span>\n <span class=\"detail-value\">{{ selectedModel.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openModelFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n }\n</div>"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAsC,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,yBAAyB,EAAmB,wBAAwB,EAAiC,MAAM,+BAA+B,CAAC;AAChN,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EACH,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EAEd,cAAc,EACd,oBAAoB,EAEpB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EAC1B,MAAM,qCAAqC,CAAC;;AAC7C;;GAEG;AACH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C;;;;GAIG;AACH,qBAQa,iCAAkC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IA6DjG,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,iBAAiB;IA1DtB,IAAI,EAAE,WAAW,CAAU;IAC3B,SAAS,UAAS;IAClB,UAAU,EAAE,iBAAiB,EAAE,CAAM;IACrC,UAAU,EAAE,yBAAyB,EAAE,CAAM;IAC7C,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IACnD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,QAAQ,EAAE,wBAAwB,CAAW;IAC7C,kBAAkB,UAAS;IAG3B,gBAAgB,UAAS;IACzB,iBAAiB,EAAE,cAAc,GAAG,IAAI,CAAQ;IAChD,oBAAoB,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IAC9D,iBAAiB,EAAE,MAAM,CAAM;IAG/B,iBAAiB,UAAS;IAC1B,cAAc,EAAE,MAAM,CAAM;IAC5B,iBAAiB,EAAE,MAAM,CAAM;IAG/B,eAAe,UAAS;IAGxB,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAC/B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,cAAc,CAAM;IAGrB,4BAA4B,EAAE,wBAAwB,CAQ3D;IAGK,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAa;IAG3E,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAa;IAEpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEnB,eAAe,EAAG,wBAAwB,CAAC;gBAO7D,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,cAAc,EACrB,iBAAiB,EAAE,iBAAiB;IAShD,QAAQ,IAAI,IAAI;IAMhB,WAAW,IAAI,IAAI;IASb,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ/D;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAcvD;;OAEG;IACI,YAAY,IAAI,IAAI;IAU3B;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAIvD;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1E;;;;OAIG;IACU,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCtE;;;;;;OAMG;YACW,0BAA0B;IAgCxC;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E;;OAEG;IACI,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAKzD;;OAEG;IACI,sBAAsB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAKrE;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmExE;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CxE;;;OAGG;IACI,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI;IAajE;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAexD;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IA6BxD;;OAEG;IACI,UAAU,IAAI,IAAI;IAOzB;;OAEG;IACI,cAAc,IAAI,IAAI;IAS7B;;OAEG;IACI,eAAe,IAAI,IAAI;IAa9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAmB3D;;OAEG;IACU,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCvE;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C;;OAEG;IACI,UAAU,IAAI,IAAI;IAiBzB;;OAEG;IACI,UAAU,IAAI,IAAI;IAUzB;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAuB7D;;OAEG;IACI,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IA4DnE;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAajD;;OAEG;IACI,mBAAmB,IAAI,IAAI;IASlC;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkB9C;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAY9D;;OAEG;IACI,uBAAuB,IAAI,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACI,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAOzE;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;YAWlB,cAAc;IA0E5B,OAAO,CAAC,sBAAsB;IAiC9B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,kBAAkB;yCAzgCjB,iCAAiC;2CAAjC,iCAAiC;CA6gC7C"}
1
+ {"version":3,"file":"dashboard-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts"],"names":[],"mappings":"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"}