@memberjunction/ng-dashboards 5.29.0 → 5.30.1

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 (90) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +11 -9
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +21 -19
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  12. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
  13. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  14. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  15. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +15 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
  22. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  23. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  24. package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
  25. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  26. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
  27. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  28. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
  29. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  30. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
  31. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
  32. package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
  33. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
  34. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
  35. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  36. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
  37. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  38. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
  39. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  40. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
  41. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  42. package/dist/Integration/components/connections/connections.component.d.ts +18 -1
  43. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  44. package/dist/Integration/components/connections/connections.component.js +251 -199
  45. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  46. package/dist/Integration/services/integration-data.service.d.ts +7 -2
  47. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  48. package/dist/Integration/services/integration-data.service.js +10 -2
  49. package/dist/Integration/services/integration-data.service.js.map +1 -1
  50. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
  51. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  52. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  53. package/dist/Lists/components/lists-operations-resource.component.js +12 -14
  54. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  55. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  56. package/dist/MCP/mcp-dashboard.component.js +28 -57
  57. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  58. package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
  59. package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
  60. package/dist/Permissions/audit-log-resource.component.js +380 -0
  61. package/dist/Permissions/audit-log-resource.component.js.map +1 -0
  62. package/dist/Permissions/permissions-shared.d.ts +51 -0
  63. package/dist/Permissions/permissions-shared.d.ts.map +1 -0
  64. package/dist/Permissions/permissions-shared.js +91 -0
  65. package/dist/Permissions/permissions-shared.js.map +1 -0
  66. package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
  67. package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
  68. package/dist/Permissions/resource-access-resource.component.js +342 -0
  69. package/dist/Permissions/resource-access-resource.component.js.map +1 -0
  70. package/dist/Permissions/user-access-resource.component.d.ts +39 -0
  71. package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
  72. package/dist/Permissions/user-access-resource.component.js +346 -0
  73. package/dist/Permissions/user-access-resource.component.js.map +1 -0
  74. package/dist/component-studio-dashboards.module.d.ts +1 -0
  75. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  76. package/dist/component-studio-dashboards.module.js +7 -0
  77. package/dist/component-studio-dashboards.module.js.map +1 -1
  78. package/dist/core-dashboards.module.d.ts +24 -20
  79. package/dist/core-dashboards.module.d.ts.map +1 -1
  80. package/dist/core-dashboards.module.js +26 -1
  81. package/dist/core-dashboards.module.js.map +1 -1
  82. package/dist/public-api.d.ts +4 -1
  83. package/dist/public-api.d.ts.map +1 -1
  84. package/dist/public-api.js +4 -0
  85. package/dist/public-api.js.map +1 -1
  86. package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
  87. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  88. package/dist/shared/pipes/highlight-search.pipe.js +14 -4
  89. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  90. package/package.json +51 -50
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/analytics/analytics-resource.component.ts","../../../../src/KnowledgeHub/components/analytics/analytics-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Analytics & Insights Resource Component\n *\n * Multi-tab analytics dashboard for the Knowledge Hub: Overview (interactive cards),\n * Tags (top 20, distribution), Sources (comparison, health), Pipeline (throughput,\n * processing time, errors), and Quality (confidence, weight, model comparison).\n *\n * All chart rendering is pure CSS/inline SVG -- no JS chart libraries.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\n// ================================================================\n// Interfaces\n// ================================================================\n\ninterface NavItem {\n ID: string;\n Label: string;\n Icon: string;\n}\n\ninterface DateRangeOption {\n Label: string;\n Days: number;\n}\n\ninterface KPIData {\n Label: string;\n Value: string;\n Delta: string;\n DeltaDirection: 'up' | 'down' | 'flat';\n SparklinePoints: string;\n SparklineColor: string;\n SparklineGradId: string;\n DrillDownKey: string;\n}\n\ninterface WidgetCard {\n Key: string;\n Title: string;\n Icon: string;\n}\n\ninterface TagGrowthMonth {\n Label: string;\n Count: number;\n Percentage: number;\n}\n\ninterface CoverageEntity {\n Name: string;\n Tagged: number;\n Total: number;\n Percentage: number;\n Color: string;\n StrokeDash: string;\n}\n\ninterface SourcePerformanceRow {\n Name: string;\n AvgTagsPerItem: number;\n Percentage: number;\n Color: string;\n}\n\ninterface ThroughputDay {\n Label: string;\n Percentage: number;\n IsError: boolean;\n}\n\ninterface TaxonomyStat {\n Label: string;\n Count: number;\n Color: string;\n BgColor: string;\n}\n\ninterface TopTagRow {\n Rank: number;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n WeightBarWidth: number;\n WeightBarColor: string;\n TrendPoints: string;\n TrendColor: string;\n TopEntity: string;\n FirstSeen: string;\n}\n\ninterface EntityDistributionRow {\n EntityName: string;\n Segments: EntityDistSegment[];\n}\n\ninterface EntityDistSegment {\n Label: string;\n Percentage: number;\n Color: string;\n}\n\ninterface TagDepthBar {\n Label: string;\n Count: number;\n Percentage: number;\n}\n\ninterface SourceComparisonRow {\n Name: string;\n Type: string;\n TypeIcon: string;\n TypeColor: string;\n Items: number;\n TagsGenerated: number;\n AvgTagsPerItem: number;\n AvgWeight: number;\n LastRun: string;\n Status: string;\n StatusClass: string;\n}\n\ninterface SourceHealthCard {\n Name: string;\n Uptime: number;\n Color: string;\n}\n\ninterface PipelineBar {\n Percentage: number;\n IsError: boolean;\n}\n\ninterface ProcessingStage {\n Name: string;\n Time: number;\n Percentage: number;\n Color: string;\n}\n\ninterface ActiveRunRow {\n RunID: string;\n Source: string;\n Started: string;\n Progress: number;\n Stage: string;\n StageClass: string;\n Items: number;\n}\n\ninterface ErrorLogEntry {\n Time: string;\n Source: string;\n Message: string;\n}\n\ninterface HistogramBin {\n Label: string;\n Count: number;\n Percentage: number;\n Color: string;\n}\n\ninterface WeightGroupedEntity {\n Name: string;\n High: number;\n Med: number;\n Low: number;\n}\n\ninterface LowConfidenceTag {\n Name: string;\n AvgWeight: number;\n UsageCount: number;\n TopEntity: string;\n SuggestedAction: string;\n ActionClass: string;\n}\n\ninterface ModelComparison {\n Name: string;\n Icon: string;\n IconColor: string;\n ScorePercentage: number;\n ScoreColor: string;\n AvgConfidence: number;\n TagsGenerated: number;\n Role: string;\n RoleColor: string;\n StrokeDash: string;\n}\n\ninterface CoOccurrencePairRow {\n TagAName: string;\n TagBName: string;\n Count: number;\n /** Bar width as percentage of the max count in the displayed list */\n BarWidth: number;\n}\n\ninterface DrillDownRecord {\n [key: string]: string | number | null;\n}\n\n// ================================================================\n// Component\n// ================================================================\n\n@RegisterClass(BaseResourceComponent, 'AnalyticsResource')\n@Component({\n standalone: false,\n selector: 'app-analytics-resource',\n templateUrl: './analytics-resource.component.html',\n styleUrls: ['./analytics-resource.component.css']\n})\nexport class AnalyticsResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Analytics';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n\n // ================================================================\n // Navigation\n // ================================================================\n\n public NavItems: NavItem[] = [\n { ID: 'overview', Label: 'Overview', Icon: 'fa-solid fa-grip' },\n { ID: 'tags', Label: 'Tags', Icon: 'fa-solid fa-tags' },\n { ID: 'sources', Label: 'Sources', Icon: 'fa-solid fa-database' },\n { ID: 'pipeline', Label: 'Pipeline', Icon: 'fa-solid fa-gears' },\n { ID: 'quality', Label: 'Quality', Icon: 'fa-solid fa-circle-check' },\n { ID: 'cost', Label: 'Cost & Usage', Icon: 'fa-solid fa-coins' },\n ];\n\n public ActiveTab = 'overview';\n public IsLoading = true;\n\n // ================================================================\n // Filter State\n // ================================================================\n\n public DateRanges: DateRangeOption[] = [\n { Label: '7D', Days: 7 },\n { Label: '30D', Days: 30 },\n { Label: '90D', Days: 90 },\n { Label: 'YTD', Days: -1 },\n { Label: 'All', Days: 0 },\n ];\n\n public ActiveDateRange = '30D';\n public EntityFilter = 'All Entities';\n public EntityFilterOptions: string[] = ['All Entities'];\n\n // ================================================================\n // Drill-Down\n // ================================================================\n\n public DrillDownTarget: string | null = null;\n public DrillDownData: DrillDownRecord[] = [];\n public DrillDownColumns: string[] = [];\n public IsDrillDownLoading = false;\n /** Whether the current drill-down rows have navigable records */\n public DrillDownHasActions = false;\n\n /** AN-1: Open a record from a drill-down table row */\n public OpenDrillDownRecord(row: DrillDownRecord): void {\n const entityName = row['_EntityName'] as string | null;\n const recordID = row['_RecordID'] as string | null;\n if (!entityName || !recordID) return;\n\n // D9: If this is a Tag record, navigate to Classify Tag Library instead\n if (entityName === 'MJ: Tags') {\n const tagName = row['Name'] as string ?? row['Tag Name'] as string ?? '';\n this.navigateToClassifyTagLibrary(tagName);\n return;\n }\n\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, recordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: recordID }];\n }\n this.navigationService.OpenEntityRecord(entityName, pkey);\n }\n\n /**\n * D9: Navigate to the Classify dashboard's Tag Library tab with a tag pre-selected.\n * Uses NavigationService.OpenNavItemByName to switch to the Classify nav item\n * and passes the tag name and target tab via configuration.\n */\n private navigateToClassifyTagLibrary(tagName: string): void {\n this.navigationService.OpenNavItemByName('Classify', {\n initialTab: 'tags',\n tagSearch: tagName,\n });\n }\n\n // ================================================================\n // Overview Tab Data\n // ================================================================\n\n public KPIs: KPIData[] = [];\n\n public WidgetCards: WidgetCard[] = [\n { Key: 'tagGrowth', Title: 'Tag Growth', Icon: 'fa-solid fa-chart-line' },\n { Key: 'contentCoverage', Title: 'Content Coverage', Icon: 'fa-solid fa-bullseye' },\n { Key: 'qualityScore', Title: 'Quality Score', Icon: 'fa-solid fa-gauge-high' },\n { Key: 'sourcePerformance', Title: 'Source Performance', Icon: 'fa-solid fa-ranking-star' },\n { Key: 'dailyThroughput', Title: 'Daily Throughput', Icon: 'fa-solid fa-bolt' },\n { Key: 'taxonomyHealth', Title: 'Taxonomy Health', Icon: 'fa-solid fa-sitemap' },\n ];\n\n public TagGrowthData: TagGrowthMonth[] = [];\n public CoverageData: CoverageEntity[] = [];\n public QualityScore = 0;\n public MiniConfidenceBins: { Height: number; Color: string; Title: string }[] = [];\n public SourcePerfData: SourcePerformanceRow[] = [];\n public ThroughputData: ThroughputDay[] = [];\n public TaxonomyTotal = 0;\n public TaxonomyStats: TaxonomyStat[] = [];\n public TaxonomyRingSegments: { StrokeDash: string; StrokeOffset: string; Color: string }[] = [];\n\n // ================================================================\n // Tags Tab Data\n // ================================================================\n\n public TopTags: TopTagRow[] = [];\n public EntityDistribution: EntityDistributionRow[] = [];\n public DistributionLegend: { Label: string; Color: string }[] = [\n { Label: 'Primary', Color: 'var(--mj-brand-primary)' },\n { Label: 'Secondary', Color: 'var(--mj-status-info)' },\n { Label: 'Tertiary', Color: '#7c3aed' },\n { Label: 'Quaternary', Color: 'var(--mj-status-success)' },\n { Label: 'Other', Color: 'var(--mj-status-warning)' },\n ];\n public TagDepthBars: TagDepthBar[] = [];\n\n // --- Co-occurrence data ---\n public CoOccurrencePairs: CoOccurrencePairRow[] = [];\n public CoOccurrenceLastComputed: string | null = null;\n public IsRecomputingCoOccurrence = false;\n\n // ================================================================\n // Sources Tab Data\n // ================================================================\n\n public SourceComparison: SourceComparisonRow[] = [];\n public SelectedSourceName = '';\n public SourceWeeklyBars: { Label: string; Value: number; Percentage: number }[] = [];\n public SourceQualityBands: { Label: string; Percentage: number; Color: string }[] = [];\n public SourceQualityNote = '';\n public SourceHealthCards: SourceHealthCard[] = [];\n\n // ================================================================\n // Pipeline Tab Data\n // ================================================================\n\n public PipelineThroughputBars: PipelineBar[] = [];\n public PipelineDateLabels: string[] = [];\n public ProcessingStages: ProcessingStage[] = [];\n public TotalAvgProcessingTime = 0;\n public BottleneckStage = '';\n public BottleneckPercent = 0;\n public SuccessRateAvg = 0;\n public FailureRateAvg = 0;\n public ActiveRuns: ActiveRunRow[] = [];\n public ErrorLog: ErrorLogEntry[] = [];\n\n // ================================================================\n // Quality Tab Data\n // ================================================================\n\n public ConfidenceHistogram: HistogramBin[] = [];\n public ConfidenceStats: { Label: string; Value: string }[] = [];\n public WeightByEntity: WeightGroupedEntity[] = [];\n public WeightLegend: { Label: string; Color: string }[] = [\n { Label: 'High (>0.7)', Color: 'var(--mj-brand-primary)' },\n { Label: 'Medium (0.4-0.7)', Color: 'var(--mj-status-info)' },\n { Label: 'Low (<0.4)', Color: 'var(--mj-text-muted)' },\n ];\n public AccuracyLinePoints = '';\n public AccuracyDots: { Cx: number; Cy: number }[] = [];\n public AccuracyMonthLabels: string[] = [];\n public AccuracyTrendText = '';\n public LowConfidenceTags: LowConfidenceTag[] = [];\n public ModelComparisons: ModelComparison[] = [];\n public ModelRecommendation = '';\n\n // ================================================================\n // Trending Tags (sidebar)\n // ================================================================\n\n public TrendingTags: { Name: string; Size: number; Weight: number }[] = [];\n public PipelineStatusText = 'Loading...';\n public PipelineStatusOk = true;\n\n // ================================================================\n // Cost & Usage Tab Data (D1)\n // ================================================================\n\n public CostKPIs: { Label: string; Value: string; Icon: string; SubLabel: string }[] = [];\n public CostPerRunRows: { RunID: string; Source: string; Tokens: number; Cost: number; Started: string }[] = [];\n\n // ================================================================\n // Raw data for aggregation\n // ================================================================\n\n private rawTags: Record<string, unknown>[] = [];\n private rawContentItemTags: Record<string, unknown>[] = [];\n private rawContentItems: Record<string, unknown>[] = [];\n public rawProcessRuns: Record<string, unknown>[] = [];\n private rawContentSources: Record<string, unknown>[] = [];\n private rawContentTypes: Record<string, unknown>[] = [];\n private rawRunDetails: Record<string, unknown>[] = [];\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await UserInfoEngine.Instance.Config(false);\n this.loadAnalyticsPreferences();\n this.loadAllData();\n this.emitAgentContext();\n this.registerAgentTools();\n this.NotifyLoadComplete();\n }\n\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n ActiveTab: this.ActiveTab,\n DateRange: this.ActiveDateRange,\n EntityFilter: this.EntityFilter,\n KPIs: this.KPIs.map(k => ({ Label: k.Label, Value: k.Value })),\n });\n }\n\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SwitchAnalyticsTab',\n Description: 'Switch to a specific analytics tab (overview, tags, sources, pipeline, quality)',\n ParameterSchema: { type: 'object', properties: { tab: { type: 'string' } }, required: ['tab'] },\n Handler: async (params: Record<string, unknown>) => {\n this.SelectTab(params['tab'] as string);\n return { Success: true };\n },\n },\n {\n Name: 'SetAnalyticsDateRange',\n Description: 'Set the analytics date range filter (7D, 30D, 90D, YTD, All)',\n ParameterSchema: { type: 'object', properties: { range: { type: 'string' } }, required: ['range'] },\n Handler: async (params: Record<string, unknown>) => {\n this.SetDateRange(params['range'] as string);\n return { Success: true };\n },\n },\n {\n Name: 'ExportAnalyticsCSV',\n Description: 'Export analytics data as CSV',\n ParameterSchema: { type: 'object', properties: { dataKey: { type: 'string' } }, required: ['dataKey'] },\n Handler: async (params: Record<string, unknown>) => {\n this.ExportTabDataCSV(params['dataKey'] as string);\n return { Success: true };\n },\n },\n ]);\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n public SelectTab(tabId: string): void {\n this.ActiveTab = tabId;\n this.CloseDrillDown();\n this.persistAnalyticsPreferences();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n public SetDateRange(label: string): void {\n this.ActiveDateRange = label;\n this.CloseDrillDown();\n this.rebuildAllAggregations();\n this.persistAnalyticsPreferences();\n this.cdr.detectChanges();\n }\n\n public SetEntityFilter(value: string): void {\n this.EntityFilter = value;\n this.CloseDrillDown();\n this.rebuildAllAggregations();\n this.persistAnalyticsPreferences();\n this.cdr.detectChanges();\n }\n\n public OpenDrillDown(key: string): void {\n if (this.DrillDownTarget === key) {\n this.CloseDrillDown();\n return;\n }\n this.DrillDownTarget = key;\n this.IsDrillDownLoading = true;\n this.cdr.detectChanges();\n this.loadDrillDownData(key);\n }\n\n public CloseDrillDown(): void {\n this.DrillDownTarget = null;\n this.DrillDownData = [];\n this.DrillDownColumns = [];\n this.IsDrillDownLoading = false;\n this.DrillDownHasActions = false;\n this.cdr.detectChanges();\n }\n\n // ================================================================\n // AN-3: Export (CSV)\n // ================================================================\n\n /** Export drill-down data as CSV */\n public ExportDrillDownCSV(): void {\n if (this.DrillDownData.length === 0 || this.DrillDownColumns.length === 0) return;\n const filename = `analytics-${this.DrillDownTarget || 'data'}-${new Date().toISOString().slice(0, 10)}.csv`;\n this.downloadCSV(this.DrillDownColumns, this.DrillDownData, filename);\n }\n\n /** Export a named data set (top-tags, sources, etc.) as CSV */\n public ExportTabDataCSV(dataKey: string): void {\n switch (dataKey) {\n case 'top-tags': {\n const cols = ['Rank', 'Name', 'Usage Count', 'Avg Weight', 'Top Entity', 'First Seen'];\n const rows = this.TopTags.map(t => ({\n 'Rank': t.Rank, 'Name': t.Name, 'Usage Count': t.UsageCount,\n 'Avg Weight': t.AvgWeight, 'Top Entity': t.TopEntity, 'First Seen': t.FirstSeen,\n }));\n this.downloadCSV(cols, rows, `top-tags-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n case 'kpis': {\n const cols = ['Metric', 'Value', 'Change'];\n const rows = this.KPIs.map(k => ({\n 'Metric': k.Label, 'Value': k.Value, 'Change': k.Delta,\n }));\n this.downloadCSV(cols, rows, `kpis-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n case 'cost-usage': {\n const costCols = ['Run ID', 'Source', 'Tokens', 'Cost', 'Started'];\n const costRows = this.CostPerRunRows.map(r => ({\n 'Run ID': r.RunID, 'Source': r.Source, 'Tokens': r.Tokens,\n 'Cost': r.Cost, 'Started': r.Started,\n }));\n this.downloadCSV(costCols, costRows, `cost-usage-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n default:\n break;\n }\n }\n\n private downloadCSV(columns: string[], data: Record<string, string | number | null>[], filename: string): void {\n const escape = (v: string | number | null): string => {\n const s = String(v ?? '');\n return s.includes(',') || s.includes('\"') || s.includes('\\n')\n ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const header = columns.map(escape).join(',');\n const rows = data.map(row => columns.map(c => escape(row[c])).join(','));\n const csv = [header, ...rows].join('\\n');\n\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n public SelectSource(name: string): void {\n this.SelectedSourceName = name;\n this.buildSourceDetail();\n this.cdr.detectChanges();\n }\n\n public FormatNumber(n: number): string {\n if (n >= 1000) {\n return n.toLocaleString();\n }\n return String(n);\n }\n\n public TrackByIndex(index: number): number {\n return index;\n }\n\n public TrackByID(_index: number, item: { ID?: string; Key?: string; Label?: string; Name?: string }): string {\n return item.ID || item.Key || item.Label || item.Name || String(_index);\n }\n\n // ================================================================\n // Data Loading\n // ================================================================\n\n private async loadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const results = await rv.RunViews([\n { EntityName: 'MJ: Tags', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Item Tags', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Items', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Process Runs', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Sources', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Types', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Process Run Details', ExtraFilter: '', ResultType: 'simple' },\n ]);\n\n this.rawTags = results[0]?.Success ? results[0].Results : [];\n this.rawContentItemTags = results[1]?.Success ? results[1].Results : [];\n this.rawContentItems = results[2]?.Success ? results[2].Results : [];\n this.rawProcessRuns = results[3]?.Success ? results[3].Results : [];\n this.rawContentSources = results[4]?.Success ? results[4].Results : [];\n this.rawContentTypes = results[5]?.Success ? results[5].Results : [];\n this.rawRunDetails = results[6]?.Success ? results[6].Results : [];\n\n this.buildEntityFilterOptions();\n this.rebuildAllAggregations();\n\n } catch (error) {\n console.error('[Analytics] Error loading data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ================================================================\n // Entity Filter Options\n // ================================================================\n\n private buildEntityFilterOptions(): void {\n const md = new Metadata();\n const entityNames = new Set<string>();\n for (const item of this.rawContentItems) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n if (ct) {\n entityNames.add(String(ct['Name'] || 'Unknown'));\n }\n }\n this.EntityFilterOptions = ['All Entities', ...Array.from(entityNames).sort()];\n }\n\n // ================================================================\n // Aggregation Orchestrator\n // ================================================================\n\n private rebuildAllAggregations(): void {\n const filteredItems = this.getDateFilteredItems(this.rawContentItems);\n const filteredTags = this.getDateFilteredItems(this.rawContentItemTags);\n const filteredRuns = this.getDateFilteredItems(this.rawProcessRuns);\n\n this.buildKPIs(filteredTags, filteredItems);\n this.buildTagGrowth();\n this.buildCoverageData(filteredItems, filteredTags);\n this.buildQualityScore(filteredTags);\n this.buildSourcePerformance(filteredItems, filteredTags);\n this.buildThroughput(filteredRuns);\n this.buildTaxonomyHealth();\n this.buildTopTags(filteredTags);\n this.buildEntityDistribution(filteredTags);\n this.buildTagDepth();\n this.buildSourceComparison(filteredItems, filteredTags, filteredRuns);\n this.buildSourceHealth(filteredRuns);\n this.buildPipelineThroughput(filteredRuns);\n this.buildProcessingStages(filteredRuns);\n this.buildActiveRuns();\n this.buildErrorLog(filteredRuns);\n this.buildConfidenceHistogram(filteredTags);\n this.buildWeightByEntity(filteredTags);\n this.buildAccuracyTrend(filteredTags);\n this.buildLowConfidenceTags(filteredTags);\n this.buildModelComparisons();\n this.buildTrendingTags(filteredTags);\n this.buildPipelineStatus(filteredRuns);\n this.buildCostUsageData(filteredRuns);\n\n if (this.rawContentSources.length > 0) {\n this.SelectedSourceName = String(this.rawContentSources[0]['Name'] || '');\n this.buildSourceDetail();\n }\n\n // Load co-occurrence data in background (non-blocking)\n this.loadCoOccurrenceData();\n }\n\n // ================================================================\n // Date Filtering\n // ================================================================\n\n private getDateFilteredItems(items: Record<string, unknown>[]): Record<string, unknown>[] {\n const range = this.DateRanges.find(d => d.Label === this.ActiveDateRange);\n if (!range || range.Days === 0) return items; // \"All\"\n\n const now = new Date();\n let cutoff: Date;\n if (range.Days === -1) {\n // YTD\n cutoff = new Date(now.getFullYear(), 0, 1);\n } else {\n cutoff = new Date(now.getTime() - range.Days * 86400000);\n }\n\n return items.filter(item => {\n const d = item['__mj_CreatedAt'] || item['StartTime'];\n if (!d) return true;\n const dt = new Date(String(d));\n return dt >= cutoff;\n });\n }\n\n // ================================================================\n // KPIs\n // ================================================================\n\n private buildKPIs(tags: Record<string, unknown>[], items: Record<string, unknown>[]): void {\n const totalTags = this.rawTags.length;\n const itemsProcessed = items.length;\n\n const weights = tags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avgConfidence = weights.length > 0\n ? weights.reduce((a, b) => a + b, 0) / weights.length\n : 0;\n\n const totalContentItems = this.rawContentItems.length;\n const taggedItemIds = new Set(tags.map(t => String(t['ItemID'] || '')));\n const coveragePct = totalContentItems > 0\n ? Math.round((taggedItemIds.size / totalContentItems) * 100)\n : 0;\n\n // Calculate weekly delta for tags\n const weekAgo = new Date(Date.now() - 7 * 86400000);\n const recentTags = this.rawTags.filter(t => {\n const d = t['__mj_CreatedAt'];\n return d && new Date(String(d)) >= weekAgo;\n });\n\n this.KPIs = [\n {\n Label: 'Total Tags',\n Value: this.FormatNumber(totalTags),\n Delta: `+${recentTags.length} this week`,\n DeltaDirection: recentTags.length > 0 ? 'up' : 'flat',\n SparklinePoints: '2,24 10,22 18,20 26,18 34,14 42,12 50,8 62,4',\n SparklineColor: 'var(--mj-brand-primary)',\n SparklineGradId: 'sparkGrad1',\n DrillDownKey: 'kpi-totalTags',\n },\n {\n Label: 'Items Processed',\n Value: this.FormatNumber(itemsProcessed),\n Delta: `${this.FormatNumber(itemsProcessed)} total`,\n DeltaDirection: 'up',\n SparklinePoints: '2,18 8,12 14,16 20,10 26,14 32,8 38,12 44,6 50,10 56,4 62,8',\n SparklineColor: 'var(--mj-status-success)',\n SparklineGradId: 'sparkGrad2',\n DrillDownKey: 'kpi-itemsProcessed',\n },\n {\n Label: 'Avg Confidence',\n Value: avgConfidence.toFixed(2),\n Delta: avgConfidence >= 0.7 ? 'Good' : 'Needs improvement',\n DeltaDirection: avgConfidence >= 0.7 ? 'up' : 'down',\n SparklinePoints: '2,20 10,18 18,16 26,18 34,14 42,12 50,14 62,10',\n SparklineColor: 'var(--mj-status-warning)',\n SparklineGradId: 'sparkGrad3',\n DrillDownKey: 'kpi-avgConfidence',\n },\n {\n Label: 'Coverage',\n Value: `${coveragePct}%`,\n Delta: `${taggedItemIds.size} of ${totalContentItems} items`,\n DeltaDirection: coveragePct >= 50 ? 'up' : 'down',\n SparklinePoints: '2,24 10,22 18,20 26,18 34,16 42,14 50,12 62,10',\n SparklineColor: '#7c3aed',\n SparklineGradId: 'sparkGrad4',\n DrillDownKey: 'kpi-coverage',\n },\n ];\n }\n\n // ================================================================\n // Tag Growth (monthly bar chart)\n // ================================================================\n\n private buildTagGrowth(): void {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const now = new Date();\n const months: TagGrowthMonth[] = [];\n let cumulative = 0;\n\n // Count tags by month for last 6 months\n for (let i = 5; i >= 0; i--) {\n const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);\n const nextMonth = new Date(now.getFullYear(), now.getMonth() - i + 1, 1);\n const count = this.rawTags.filter(t => {\n const d = t['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= monthDate && dt < nextMonth;\n }).length;\n cumulative += count;\n months.push({\n Label: monthNames[monthDate.getMonth()],\n Count: cumulative,\n Percentage: 0,\n });\n }\n\n // If no data, show the total in the last month\n if (cumulative === 0 && this.rawTags.length > 0) {\n months[months.length - 1].Count = this.rawTags.length;\n cumulative = this.rawTags.length;\n }\n\n const max = Math.max(...months.map(m => m.Count), 1);\n months.forEach(m => m.Percentage = Math.round((m.Count / max) * 100));\n this.TagGrowthData = months;\n }\n\n // ================================================================\n // Content Coverage (progress rings per entity type)\n // ================================================================\n\n private buildCoverageData(items: Record<string, unknown>[], tags: Record<string, unknown>[]): void {\n const colors = ['var(--mj-status-warning)', 'var(--mj-status-success)', 'var(--mj-status-info)', 'var(--mj-brand-primary)'];\n const typeMap = new Map<string, { name: string; total: number; tagged: Set<string> }>();\n\n for (const item of this.rawContentItems) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n if (!typeMap.has(typeName)) {\n typeMap.set(typeName, { name: typeName, total: 0, tagged: new Set() });\n }\n typeMap.get(typeName)!.total++;\n }\n\n const taggedItemIdsByType = new Map<string, Set<string>>();\n for (const tag of tags) {\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n if (typeMap.has(typeName)) {\n typeMap.get(typeName)!.tagged.add(itemId);\n }\n }\n }\n\n const circumference = 2 * Math.PI * 20; // r=20\n let idx = 0;\n this.CoverageData = Array.from(typeMap.values())\n .sort((a, b) => b.total - a.total)\n .slice(0, 4)\n .map(entry => {\n const pct = entry.total > 0 ? Math.round((entry.tagged.size / entry.total) * 100) : 0;\n const dashLength = (pct / 100) * circumference;\n const color = colors[idx % colors.length];\n idx++;\n return {\n Name: entry.name,\n Tagged: entry.tagged.size,\n Total: entry.total,\n Percentage: pct,\n Color: color,\n StrokeDash: `${dashLength.toFixed(1)} ${circumference.toFixed(1)}`,\n };\n });\n }\n\n // ================================================================\n // Quality Score (gauge)\n // ================================================================\n\n private buildQualityScore(tags: Record<string, unknown>[]): void {\n const weights = tags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n this.QualityScore = weights.length > 0\n ? Math.round((weights.reduce((a, b) => a + b, 0) / weights.length) * 100)\n : 0;\n\n // Mini confidence bins\n const bins = [0, 0, 0, 0, 0]; // 0-0.2, 0.2-0.4, 0.4-0.6, 0.6-0.8, 0.8-1.0\n for (const w of weights) {\n const idx = Math.min(Math.floor(w * 5), 4);\n bins[idx]++;\n }\n const maxBin = Math.max(...bins, 1);\n const binColors = [\n 'var(--mj-border-default)', 'var(--mj-border-default)',\n 'var(--mj-status-warning)', 'var(--mj-brand-primary)', 'var(--mj-brand-primary)',\n ];\n this.MiniConfidenceBins = bins.map((count, i) => ({\n Height: Math.max(4, Math.round((count / maxBin) * 32)),\n Color: binColors[i],\n Title: `${(i * 0.2).toFixed(1)}-${((i + 1) * 0.2).toFixed(1)}: ${count}`,\n }));\n }\n\n // ================================================================\n // Source Performance (horizontal bars)\n // ================================================================\n\n private buildSourcePerformance(items: Record<string, unknown>[], tags: Record<string, unknown>[]): void {\n const sourceTagCounts = new Map<string, { name: string; items: Set<string>; tagCount: number }>();\n\n for (const source of this.rawContentSources) {\n const sid = String(source['ID']);\n sourceTagCounts.set(sid, {\n name: String(source['Name'] || 'Unknown'),\n items: new Set(),\n tagCount: 0,\n });\n }\n\n for (const item of this.rawContentItems) {\n const sid = String(item['ContentSourceID'] || '');\n const entry = sourceTagCounts.get(sid);\n if (entry) {\n entry.items.add(String(item['ID']));\n }\n }\n\n for (const tag of tags) {\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const sid = String(item['ContentSourceID'] || '');\n const entry = sourceTagCounts.get(sid);\n if (entry) {\n entry.tagCount++;\n }\n }\n }\n\n const colors = ['var(--mj-brand-primary)', '#7c3aed', 'var(--mj-status-info)', 'var(--mj-status-success)'];\n const sorted = Array.from(sourceTagCounts.values())\n .map(e => ({\n name: e.name,\n avg: e.items.size > 0 ? e.tagCount / e.items.size : 0,\n }))\n .sort((a, b) => b.avg - a.avg)\n .slice(0, 4);\n\n const maxAvg = Math.max(...sorted.map(s => s.avg), 1);\n this.SourcePerfData = sorted.map((s, i) => ({\n Name: s.name,\n AvgTagsPerItem: Math.round(s.avg * 10) / 10,\n Percentage: Math.round((s.avg / maxAvg) * 100),\n Color: colors[i % colors.length],\n }));\n }\n\n // ================================================================\n // Daily Throughput (14-day bar chart)\n // ================================================================\n\n private buildThroughput(runs: Record<string, unknown>[]): void {\n const days: ThroughputDay[] = [];\n const now = new Date();\n\n for (let i = 13; i >= 0; i--) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i);\n const dayStr = d.toISOString().slice(0, 10);\n const dayRuns = runs.filter(r => {\n const st = r['StartTime'];\n if (!st) return false;\n return String(st).slice(0, 10) === dayStr;\n });\n const totalItems = dayRuns.reduce((sum, r) => sum + Number(r['ProcessedItems'] || 0), 0);\n const hasError = dayRuns.some(r => String(r['Status'] || '').toLowerCase().includes('error') || String(r['Status'] || '').toLowerCase().includes('fail'));\n\n days.push({\n Label: String(d.getDate()),\n Percentage: totalItems,\n IsError: hasError,\n });\n }\n\n const maxItems = Math.max(...days.map(d => d.Percentage), 1);\n days.forEach(d => d.Percentage = Math.max(5, Math.round((d.Percentage / maxItems) * 100)));\n this.ThroughputData = days;\n }\n\n // ================================================================\n // Taxonomy Health (donut + stat cards)\n // ================================================================\n\n private buildTaxonomyHealth(): void {\n const total = this.rawTags.length;\n this.TaxonomyTotal = total;\n\n if (total === 0) {\n this.TaxonomyStats = [\n { Label: 'Healthy', Count: 0, Color: 'var(--mj-status-success)', BgColor: 'color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface))' },\n { Label: 'Attention', Count: 0, Color: 'var(--mj-status-warning)', BgColor: 'color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface))' },\n { Label: 'Orphaned', Count: 0, Color: 'var(--mj-status-error)', BgColor: 'color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface))' },\n ];\n this.TaxonomyRingSegments = [];\n return;\n }\n\n // Tags with children = healthy, tags referenced by content items = healthy\n // Tags with no children and no usage = orphaned\n // Tags with low usage = attention\n const tagIds = new Set(this.rawTags.map(t => String(t['ID'])));\n const parentIds = new Set(this.rawTags.filter(t => t['ParentID']).map(t => String(t['ParentID'])));\n const usedTagIds = new Set(this.rawContentItemTags.filter(ct => ct['TagID']).map(ct => String(ct['TagID'])));\n\n let healthy = 0;\n let attention = 0;\n let orphaned = 0;\n\n for (const tag of this.rawTags) {\n const tid = String(tag['ID']);\n const hasChildren = parentIds.has(tid);\n const isUsed = usedTagIds.has(tid);\n if (hasChildren || isUsed) {\n healthy++;\n } else if (tag['ParentID']) {\n attention++;\n } else {\n orphaned++;\n }\n }\n\n this.TaxonomyStats = [\n { Label: 'Healthy', Count: healthy, Color: 'var(--mj-status-success)', BgColor: 'color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface))' },\n { Label: 'Attention', Count: attention, Color: 'var(--mj-status-warning)', BgColor: 'color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface))' },\n { Label: 'Orphaned', Count: orphaned, Color: 'var(--mj-status-error)', BgColor: 'color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface))' },\n ];\n\n // Ring segments\n const circumference = 2 * Math.PI * 54; // r=54\n const healthyPct = healthy / total;\n const attentionPct = attention / total;\n const orphanedPct = orphaned / total;\n\n const segments: { StrokeDash: string; StrokeOffset: string; Color: string }[] = [];\n let offset = circumference * 0.25; // start at top\n\n if (healthyPct > 0) {\n const len = healthyPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-success)',\n });\n offset += len;\n }\n if (attentionPct > 0) {\n const len = attentionPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-warning)',\n });\n offset += len;\n }\n if (orphanedPct > 0) {\n const len = orphanedPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-error)',\n });\n }\n\n this.TaxonomyRingSegments = segments;\n }\n\n // ================================================================\n // Top Tags Table\n // ================================================================\n\n private buildTopTags(tags: Record<string, unknown>[]): void {\n const tagUsage = new Map<string, { name: string; count: number; totalWeight: number; entities: Map<string, number>; firstSeen: Date }>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n if (!tagText) continue;\n\n if (!tagUsage.has(tagText)) {\n const created = tag['__mj_CreatedAt'] ? new Date(String(tag['__mj_CreatedAt'])) : new Date();\n tagUsage.set(tagText, { name: tagText, count: 0, totalWeight: 0, entities: new Map(), firstSeen: created });\n }\n const entry = tagUsage.get(tagText)!;\n entry.count++;\n entry.totalWeight += Number(tag['Weight'] || 0);\n\n // Find entity for this tag\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n entry.entities.set(typeName, (entry.entities.get(typeName) || 0) + 1);\n }\n\n const created = tag['__mj_CreatedAt'] ? new Date(String(tag['__mj_CreatedAt'])) : new Date();\n if (created < entry.firstSeen) entry.firstSeen = created;\n }\n\n const sorted = Array.from(tagUsage.values()).sort((a, b) => b.count - a.count).slice(0, 20);\n const maxCount = sorted.length > 0 ? sorted[0].count : 1;\n\n this.TopTags = sorted.map((entry, idx) => {\n const avgWeight = entry.count > 0 ? entry.totalWeight / entry.count : 0;\n const topEntity = entry.entities.size > 0\n ? Array.from(entry.entities.entries()).sort((a, b) => b[1] - a[1])[0][0]\n : 'N/A';\n\n let weightColor = 'var(--mj-brand-primary)';\n if (avgWeight >= 0.8) weightColor = 'var(--mj-status-success)';\n else if (avgWeight < 0.5) weightColor = 'var(--mj-status-warning)';\n else if (avgWeight < 0.4) weightColor = 'var(--mj-status-error)';\n\n // Generate simple trend sparkline points\n const trendPoints = this.generateTrendPoints(avgWeight);\n const trendColor = avgWeight >= 0.6 ? 'var(--mj-status-success)' : 'var(--mj-brand-primary)';\n\n return {\n Rank: idx + 1,\n Name: entry.name,\n UsageCount: entry.count,\n AvgWeight: Math.round(avgWeight * 100) / 100,\n WeightBarWidth: Math.round(avgWeight * 80),\n WeightBarColor: weightColor,\n TrendPoints: trendPoints,\n TrendColor: trendColor,\n TopEntity: topEntity,\n FirstSeen: entry.firstSeen.toISOString().slice(0, 10),\n };\n });\n }\n\n private generateTrendPoints(weight: number): string {\n // Generate a gentle trend line based on weight\n const baseY = 14 - weight * 8;\n const variance = 3;\n const points: string[] = [];\n for (let x = 2; x <= 46; x += 8) {\n const y = Math.max(2, Math.min(14, baseY + (Math.random() - 0.5) * variance));\n points.push(`${x},${y.toFixed(0)}`);\n }\n return points.join(' ');\n }\n\n // ================================================================\n // Entity Distribution (stacked bars)\n // ================================================================\n\n private buildEntityDistribution(tags: Record<string, unknown>[]): void {\n const entityTagDist = new Map<string, Map<string, number>>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (!item || !tagText) continue;\n\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n\n if (!entityTagDist.has(typeName)) entityTagDist.set(typeName, new Map());\n const tagMap = entityTagDist.get(typeName)!;\n tagMap.set(tagText, (tagMap.get(tagText) || 0) + 1);\n }\n\n const segmentColors = ['var(--mj-brand-primary)', 'var(--mj-status-info)', '#7c3aed', 'var(--mj-status-success)', 'var(--mj-status-warning)'];\n\n this.EntityDistribution = Array.from(entityTagDist.entries())\n .sort((a, b) => {\n const totalA = Array.from(a[1].values()).reduce((s, v) => s + v, 0);\n const totalB = Array.from(b[1].values()).reduce((s, v) => s + v, 0);\n return totalB - totalA;\n })\n .slice(0, 4)\n .map(([entityName, tagMap]) => {\n const total = Array.from(tagMap.values()).reduce((s, v) => s + v, 0);\n const topTags = Array.from(tagMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4);\n\n const segments: EntityDistSegment[] = [];\n let accumulatedPct = 0;\n\n topTags.forEach(([name, count], i) => {\n const pct = Math.round((count / total) * 100);\n accumulatedPct += pct;\n segments.push({\n Label: name.length > 6 ? name.slice(0, 5) + '.' : name,\n Percentage: pct,\n Color: segmentColors[i % segmentColors.length],\n });\n });\n\n if (accumulatedPct < 100) {\n segments.push({\n Label: '...',\n Percentage: 100 - accumulatedPct,\n Color: segmentColors[4],\n });\n }\n\n return { EntityName: entityName, Segments: segments };\n });\n }\n\n // ================================================================\n // Tag Depth Distribution\n // ================================================================\n\n private buildTagDepth(): void {\n const parentMap = new Map<string, string | null>();\n for (const tag of this.rawTags) {\n parentMap.set(String(tag['ID']), tag['ParentID'] ? String(tag['ParentID']) : null);\n }\n\n const depthCounts = new Map<number, number>();\n for (const tag of this.rawTags) {\n let depth = 1;\n let current = tag['ParentID'] ? String(tag['ParentID']) : null;\n while (current && depth < 10) {\n depth++;\n current = parentMap.get(current) || null;\n }\n depthCounts.set(depth, (depthCounts.get(depth) || 0) + 1);\n }\n\n const maxDepth = Math.max(...Array.from(depthCounts.keys()), 1);\n const maxCount = Math.max(...Array.from(depthCounts.values()), 1);\n const bars: TagDepthBar[] = [];\n\n for (let d = 1; d <= Math.max(maxDepth, 5); d++) {\n const count = depthCounts.get(d) || 0;\n bars.push({\n Label: `Depth ${d}`,\n Count: count,\n Percentage: Math.max(count > 0 ? 7 : 0, Math.round((count / maxCount) * 100)),\n });\n }\n\n this.TagDepthBars = bars;\n }\n\n // ================================================================\n // Source Comparison Table\n // ================================================================\n\n private buildSourceComparison(\n items: Record<string, unknown>[],\n tags: Record<string, unknown>[],\n runs: Record<string, unknown>[]\n ): void {\n this.SourceComparison = this.rawContentSources.map(source => {\n const sid = String(source['ID']);\n const sourceItems = items.filter(i => String(i['ContentSourceID']) === sid);\n const sourceItemIds = new Set(sourceItems.map(i => String(i['ID'])));\n const sourceTags = tags.filter(t => sourceItemIds.has(String(t['ItemID'] || '')));\n const avgTags = sourceItems.length > 0 ? sourceTags.length / sourceItems.length : 0;\n const weights = sourceTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avgWeight = weights.length > 0 ? weights.reduce((a, b) => a + b, 0) / weights.length : 0;\n\n const sourceRuns = runs.filter(r => String(r['SourceID']) === sid);\n const lastRun = sourceRuns.length > 0\n ? sourceRuns.sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())[0]\n : null;\n\n const hasError = lastRun && String(lastRun['Status'] || '').toLowerCase().includes('error');\n const isSlow = lastRun && !hasError && sourceRuns.length > 0;\n\n // Determine source type\n const ctid = String(source['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Source') : 'Source';\n\n return {\n Name: String(source['Name'] || 'Unknown'),\n Type: typeName,\n TypeIcon: this.getSourceTypeIcon(typeName),\n TypeColor: this.getSourceTypeColor(typeName),\n Items: sourceItems.length,\n TagsGenerated: sourceTags.length,\n AvgTagsPerItem: Math.round(avgTags * 10) / 10,\n AvgWeight: Math.round(avgWeight * 100) / 100,\n LastRun: lastRun ? this.formatRelativeTime(new Date(String(lastRun['StartTime']))) : 'Never',\n Status: hasError ? 'Error' : 'Active',\n StatusClass: hasError ? 'badge-error' : 'badge-success',\n };\n });\n }\n\n private getSourceTypeIcon(typeName: string): string {\n const lower = typeName.toLowerCase();\n if (lower.includes('rss')) return 'fa-solid fa-rss';\n if (lower.includes('entity') || lower.includes('crm') || lower.includes('contact')) return 'fa-solid fa-address-book';\n if (lower.includes('web') || lower.includes('site')) return 'fa-solid fa-globe';\n if (lower.includes('cloud') || lower.includes('drive') || lower.includes('storage')) return 'fa-solid fa-cloud';\n return 'fa-solid fa-database';\n }\n\n private getSourceTypeColor(typeName: string): string {\n const lower = typeName.toLowerCase();\n if (lower.includes('rss')) return 'var(--mj-status-warning)';\n if (lower.includes('entity') || lower.includes('crm')) return 'var(--mj-brand-primary)';\n if (lower.includes('web')) return '#7c3aed';\n if (lower.includes('cloud')) return 'var(--mj-status-info)';\n return 'var(--mj-text-muted)';\n }\n\n private formatRelativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins} min ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours} hours ago`;\n const days = Math.floor(hours / 24);\n return `${days} day${days > 1 ? 's' : ''} ago`;\n }\n\n // ================================================================\n // Source Detail (sidebar selection)\n // ================================================================\n\n private buildSourceDetail(): void {\n const source = this.rawContentSources.find(s => String(s['Name']) === this.SelectedSourceName);\n if (!source) return;\n\n const sid = String(source['ID']);\n const sourceItems = this.rawContentItems.filter(i => String(i['ContentSourceID']) === sid);\n const sourceItemIds = new Set(sourceItems.map(i => String(i['ID'])));\n const sourceTags = this.rawContentItemTags.filter(t => sourceItemIds.has(String(t['ItemID'] || '')));\n\n // Weekly bars (last 8 weeks)\n const now = new Date();\n const weekBars: { Label: string; Value: number; Percentage: number }[] = [];\n for (let w = 7; w >= 0; w--) {\n const weekStart = new Date(now.getTime() - (w + 1) * 7 * 86400000);\n const weekEnd = new Date(now.getTime() - w * 7 * 86400000);\n const count = sourceItems.filter(i => {\n const d = i['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= weekStart && dt < weekEnd;\n }).length;\n weekBars.push({ Label: `W${8 - w}`, Value: count, Percentage: 0 });\n }\n const maxWeek = Math.max(...weekBars.map(w => w.Value), 1);\n weekBars.forEach(w => w.Percentage = Math.round((w.Value / maxWeek) * 100));\n this.SourceWeeklyBars = weekBars;\n\n // Quality bands\n const weights = sourceTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const high = weights.filter(w => w > 0.8).length;\n const med = weights.filter(w => w >= 0.5 && w <= 0.8).length;\n const low = weights.filter(w => w < 0.5).length;\n const total = Math.max(weights.length, 1);\n\n this.SourceQualityBands = [\n { Label: 'High (>0.8)', Percentage: Math.round((high / total) * 100), Color: 'var(--mj-status-success)' },\n { Label: 'Med (0.5-0.8)', Percentage: Math.round((med / total) * 100), Color: 'var(--mj-status-warning)' },\n { Label: 'Low (<0.5)', Percentage: Math.round((low / total) * 100), Color: 'var(--mj-status-error)' },\n ];\n\n const highPct = Math.round((high / total) * 100);\n this.SourceQualityNote = `${this.SelectedSourceName} has ${highPct}% of tags scoring above 0.8 confidence.`;\n }\n\n // ================================================================\n // Source Health Cards\n // ================================================================\n\n private buildSourceHealth(runs: Record<string, unknown>[]): void {\n this.SourceHealthCards = this.rawContentSources.map(source => {\n const sid = String(source['ID']);\n const sourceRuns = runs.filter(r => String(r['SourceID']) === sid);\n const totalRuns = sourceRuns.length;\n const successRuns = sourceRuns.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return !status.includes('error') && !status.includes('fail');\n }).length;\n const uptime = totalRuns > 0 ? Math.round((successRuns / totalRuns) * 100) : 100;\n\n let color = 'var(--mj-status-success)';\n if (uptime < 90) color = 'var(--mj-status-warning)';\n if (uptime < 80) color = 'var(--mj-status-error)';\n\n return {\n Name: String(source['Name'] || 'Unknown'),\n Uptime: uptime,\n Color: color,\n };\n });\n }\n\n // ================================================================\n // Pipeline Throughput (30-day bars)\n // ================================================================\n\n private buildPipelineThroughput(runs: Record<string, unknown>[]): void {\n const bars: PipelineBar[] = [];\n const labels: string[] = [];\n const now = new Date();\n\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i);\n const dayStr = d.toISOString().slice(0, 10);\n const dayRuns = runs.filter(r => {\n const st = r['StartTime'];\n return st && String(st).slice(0, 10) === dayStr;\n });\n const totalItems = dayRuns.reduce((sum, r) => sum + Number(r['ProcessedItems'] || 0), 0);\n const hasError = dayRuns.some(r => {\n const s = String(r['Status'] || '').toLowerCase();\n return s.includes('error') || s.includes('fail');\n });\n bars.push({ Percentage: totalItems, IsError: hasError });\n\n if (i % 7 === 0) {\n labels.push(`${d.toLocaleString('default', { month: 'short' })} ${d.getDate()}`);\n }\n }\n\n const maxVal = Math.max(...bars.map(b => b.Percentage), 1);\n bars.forEach(b => b.Percentage = Math.max(3, Math.round((b.Percentage / maxVal) * 100)));\n this.PipelineThroughputBars = bars;\n this.PipelineDateLabels = labels;\n }\n\n // ================================================================\n // Processing Stages\n // ================================================================\n\n private buildProcessingStages(runs: Record<string, unknown>[]): void {\n // Derive stage timing from run data\n const completedRuns = runs.filter(r => r['StartTime'] && r['EndTime']);\n if (completedRuns.length === 0) {\n this.ProcessingStages = [\n { Name: 'Ingest', Time: 0, Percentage: 10, Color: 'var(--mj-status-success)' },\n { Name: 'Extract', Time: 0, Percentage: 25, Color: 'var(--mj-brand-primary)' },\n { Name: 'Chunk', Time: 0, Percentage: 6, Color: 'var(--mj-status-success)' },\n { Name: 'Tag', Time: 0, Percentage: 42, Color: 'var(--mj-status-warning)' },\n { Name: 'Vectorize', Time: 0, Percentage: 16, Color: '#7c3aed' },\n ];\n this.TotalAvgProcessingTime = 0;\n this.BottleneckStage = 'Tag';\n this.BottleneckPercent = 42;\n return;\n }\n\n // Average total processing time per item\n const avgTimes = completedRuns.map(r => {\n const start = new Date(String(r['StartTime'])).getTime();\n const end = new Date(String(r['EndTime'])).getTime();\n const items = Math.max(Number(r['ProcessedItems'] || 1), 1);\n return (end - start) / 1000 / items;\n });\n const avgTotal = avgTimes.reduce((a, b) => a + b, 0) / avgTimes.length;\n\n // Estimate stage breakdown (proportional)\n const stages: ProcessingStage[] = [\n { Name: 'Ingest', Time: Math.round(avgTotal * 0.10 * 10) / 10, Percentage: 10, Color: 'var(--mj-status-success)' },\n { Name: 'Extract', Time: Math.round(avgTotal * 0.25 * 10) / 10, Percentage: 25, Color: 'var(--mj-brand-primary)' },\n { Name: 'Chunk', Time: Math.round(avgTotal * 0.06 * 10) / 10, Percentage: 6, Color: 'var(--mj-status-success)' },\n { Name: 'Tag', Time: Math.round(avgTotal * 0.42 * 10) / 10, Percentage: 42, Color: 'var(--mj-status-warning)' },\n { Name: 'Vectorize', Time: Math.round(avgTotal * 0.16 * 10) / 10, Percentage: 16, Color: '#7c3aed' },\n ];\n\n this.ProcessingStages = stages;\n this.TotalAvgProcessingTime = Math.round(avgTotal * 10) / 10;\n this.BottleneckStage = 'Tag';\n this.BottleneckPercent = 42;\n }\n\n // ================================================================\n // Active Runs\n // ================================================================\n\n private buildActiveRuns(): void {\n const activeRuns = this.rawProcessRuns\n .filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'in progress' || status === 'processing';\n })\n .slice(0, 5);\n\n this.ActiveRuns = activeRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : new Date();\n\n return {\n RunID: String(r['ID'] || '').slice(0, 14),\n Source: source ? String(source['Name']) : 'Unknown',\n Started: this.formatRelativeTime(startTime),\n Progress: Math.floor(Math.random() * 80) + 10, // estimated\n Stage: String(r['Status'] || 'Processing'),\n StageClass: 'badge-info',\n Items: Number(r['ProcessedItems'] || 0),\n };\n });\n }\n\n // ================================================================\n // Error Log\n // ================================================================\n\n private buildErrorLog(runs: Record<string, unknown>[]): void {\n const errorRuns = runs\n .filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n })\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 5);\n\n this.ErrorLog = errorRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : new Date();\n\n return {\n Time: startTime.toLocaleString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' }),\n Source: source ? String(source['Name']) : 'Unknown',\n Message: String(r['Status'] || 'Processing error occurred'),\n };\n });\n }\n\n // ================================================================\n // Confidence Histogram\n // ================================================================\n\n private buildConfidenceHistogram(tags: Record<string, unknown>[]): void {\n const bins = new Array(10).fill(0);\n const weights: number[] = [];\n\n for (const tag of tags) {\n const w = Number(tag['Weight'] || 0);\n if (w <= 0) continue;\n weights.push(w);\n const idx = Math.min(Math.floor(w * 10), 9);\n bins[idx]++;\n }\n\n const maxBin = Math.max(...bins, 1);\n const binLabels = ['0.0-0.1', '0.1-0.2', '0.2-0.3', '0.3-0.4', '0.4-0.5', '0.5-0.6', '0.6-0.7', '0.7-0.8', '0.8-0.9', '0.9-1.0'];\n\n this.ConfidenceHistogram = bins.map((count, i) => {\n let color = 'var(--mj-status-error)';\n if (i >= 7) color = 'var(--mj-brand-primary)';\n else if (i >= 5) color = 'var(--mj-status-warning)';\n else if (i >= 3) color = 'var(--mj-status-warning)';\n if (i === 9) color = 'var(--mj-status-success)';\n\n return {\n Label: binLabels[i],\n Count: count,\n Percentage: Math.max(count > 0 ? 5 : 2, Math.round((count / maxBin) * 100)),\n Color: color,\n };\n });\n\n // Stats\n if (weights.length > 0) {\n weights.sort((a, b) => a - b);\n const mean = weights.reduce((a, b) => a + b, 0) / weights.length;\n const median = weights[Math.floor(weights.length / 2)];\n const variance = weights.reduce((sum, w) => sum + Math.pow(w - mean, 2), 0) / weights.length;\n const stdDev = Math.sqrt(variance);\n const p90 = weights[Math.floor(weights.length * 0.9)];\n\n this.ConfidenceStats = [\n { Label: 'Median', Value: median.toFixed(2) },\n { Label: 'Mean', Value: mean.toFixed(2) },\n { Label: 'Std Dev', Value: stdDev.toFixed(2) },\n { Label: 'P90', Value: p90.toFixed(2) },\n { Label: 'Total', Value: `${weights.length} tags` },\n ];\n } else {\n this.ConfidenceStats = [\n { Label: 'Median', Value: 'N/A' },\n { Label: 'Mean', Value: 'N/A' },\n { Label: 'Std Dev', Value: 'N/A' },\n { Label: 'P90', Value: 'N/A' },\n { Label: 'Total', Value: '0 tags' },\n ];\n }\n }\n\n // ================================================================\n // Weight Distribution by Entity\n // ================================================================\n\n private buildWeightByEntity(tags: Record<string, unknown>[]): void {\n const entityWeights = new Map<string, { high: number; med: number; low: number }>();\n\n for (const tag of tags) {\n const w = Number(tag['Weight'] || 0);\n if (w <= 0) continue;\n\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (!item) continue;\n\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n\n if (!entityWeights.has(typeName)) {\n entityWeights.set(typeName, { high: 0, med: 0, low: 0 });\n }\n const entry = entityWeights.get(typeName)!;\n if (w > 0.7) entry.high++;\n else if (w >= 0.4) entry.med++;\n else entry.low++;\n }\n\n this.WeightByEntity = Array.from(entityWeights.entries())\n .sort((a, b) => (b[1].high + b[1].med + b[1].low) - (a[1].high + a[1].med + a[1].low))\n .slice(0, 4)\n .map(([name, counts]) => {\n const total = Math.max(counts.high + counts.med + counts.low, 1);\n return {\n Name: name,\n High: Math.round((counts.high / total) * 100),\n Med: Math.round((counts.med / total) * 100),\n Low: Math.round((counts.low / total) * 100),\n };\n });\n }\n\n // ================================================================\n // Accuracy Trend (line chart)\n // ================================================================\n\n private buildAccuracyTrend(tags: Record<string, unknown>[]): void {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const now = new Date();\n const monthlyAvgs: number[] = [];\n const labels: string[] = [];\n\n for (let i = 6; i >= 0; i--) {\n const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);\n const nextMonth = new Date(now.getFullYear(), now.getMonth() - i + 1, 1);\n labels.push(monthNames[monthDate.getMonth()]);\n\n const monthTags = tags.filter(t => {\n const d = t['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= monthDate && dt < nextMonth;\n });\n const weights = monthTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avg = weights.length > 0 ? weights.reduce((a, b) => a + b, 0) / weights.length : 0;\n monthlyAvgs.push(avg);\n }\n\n this.AccuracyMonthLabels = labels;\n\n // Build SVG points (viewBox 0 0 400 110, with y inverted: 0=top=1.0, 110=bottom=0.0)\n const points: string[] = [];\n const dots: { Cx: number; Cy: number }[] = [];\n\n monthlyAvgs.forEach((avg, i) => {\n const x = i * (400 / Math.max(monthlyAvgs.length - 1, 1));\n const y = 110 - (avg * 110);\n points.push(`${x.toFixed(0)},${y.toFixed(0)}`);\n if (i % 2 === 0) dots.push({ Cx: Math.round(x), Cy: Math.round(y) });\n });\n\n this.AccuracyLinePoints = points.join(' ');\n this.AccuracyDots = dots;\n\n // Trend text\n const first = monthlyAvgs[0];\n const last = monthlyAvgs[monthlyAvgs.length - 1];\n if (first > 0 && last > 0) {\n const change = Math.round(((last - first) / first) * 100);\n this.AccuracyTrendText = change >= 0\n ? `Confidence trending upward: ${first.toFixed(2)} -> ${last.toFixed(2)} (+${change}%)`\n : `Confidence declining: ${first.toFixed(2)} -> ${last.toFixed(2)} (${change}%)`;\n } else {\n this.AccuracyTrendText = 'Insufficient data for trend analysis';\n }\n }\n\n // ================================================================\n // Low Confidence Tags\n // ================================================================\n\n private buildLowConfidenceTags(tags: Record<string, unknown>[]): void {\n const tagAvgs = new Map<string, { totalWeight: number; count: number; entities: Map<string, number> }>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n const w = Number(tag['Weight'] || 0);\n if (!tagText || w <= 0) continue;\n\n if (!tagAvgs.has(tagText)) {\n tagAvgs.set(tagText, { totalWeight: 0, count: 0, entities: new Map() });\n }\n const entry = tagAvgs.get(tagText)!;\n entry.totalWeight += w;\n entry.count++;\n\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n entry.entities.set(typeName, (entry.entities.get(typeName) || 0) + 1);\n }\n }\n\n this.LowConfidenceTags = Array.from(tagAvgs.entries())\n .map(([name, data]) => ({\n name,\n avgWeight: data.totalWeight / data.count,\n count: data.count,\n topEntity: data.entities.size > 0\n ? Array.from(data.entities.entries()).sort((a, b) => b[1] - a[1])[0][0]\n : 'N/A',\n }))\n .filter(t => t.avgWeight < 0.4)\n .sort((a, b) => a.avgWeight - b.avgWeight)\n .slice(0, 7)\n .map(t => ({\n Name: t.name,\n AvgWeight: Math.round(t.avgWeight * 100) / 100,\n UsageCount: t.count,\n TopEntity: t.topEntity,\n SuggestedAction: t.avgWeight < 0.25 ? 'Archive (low relevance)' : 'Review taxonomy placement',\n ActionClass: t.avgWeight < 0.25 ? 'badge-error' : 'badge-warning',\n }));\n }\n\n // ================================================================\n // Model Comparisons\n // ================================================================\n\n private buildModelComparisons(): void {\n // Model comparison requires per-model tag tracking which isn't available yet.\n // Show empty state prompting users to enable model tracking.\n this.ModelComparisons = [];\n this.ModelRecommendation = '';\n\n // If we have content item tags with model info, we could derive this.\n // For now, show an informational message.\n if (this.rawContentItemTags.length === 0) {\n this.ModelRecommendation = 'No autotagging data available yet. Run the autotagging pipeline to generate model performance metrics.';\n } else {\n this.ModelRecommendation = 'Model comparison requires per-model tag tracking. This feature will be available when AI Prompt Runs are linked to Content Item Tags.';\n }\n }\n\n // ================================================================\n // Trending Tags (sidebar)\n // ================================================================\n\n private buildTrendingTags(tags: Record<string, unknown>[]): void {\n const tagCounts = new Map<string, number>();\n const weekAgo = new Date(Date.now() - 14 * 86400000);\n\n for (const tag of tags) {\n const d = tag['__mj_CreatedAt'];\n if (d && new Date(String(d)) >= weekAgo) {\n const tagText = String(tag['Tag'] || '');\n if (tagText) {\n tagCounts.set(tagText, (tagCounts.get(tagText) || 0) + 1);\n }\n }\n }\n\n const sorted = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 10);\n const maxCount = sorted.length > 0 ? sorted[0][1] : 1;\n\n this.TrendingTags = sorted.map(([name, count]) => ({\n Name: name,\n Size: Math.max(10, Math.round((count / maxCount) * 16)),\n Weight: count > maxCount * 0.7 ? 700 : count > maxCount * 0.4 ? 600 : count > maxCount * 0.2 ? 500 : 400,\n }));\n\n // If no recent trending data, use top tags from all time\n if (this.TrendingTags.length === 0) {\n const allTagCounts = new Map<string, number>();\n for (const tag of this.rawContentItemTags) {\n const tagText = String(tag['Tag'] || '');\n if (tagText) allTagCounts.set(tagText, (allTagCounts.get(tagText) || 0) + 1);\n }\n const allSorted = Array.from(allTagCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 10);\n const allMax = allSorted.length > 0 ? allSorted[0][1] : 1;\n this.TrendingTags = allSorted.map(([name, count]) => ({\n Name: name,\n Size: Math.max(10, Math.round((count / allMax) * 16)),\n Weight: count > allMax * 0.7 ? 700 : count > allMax * 0.4 ? 600 : 500,\n }));\n }\n }\n\n // ================================================================\n // Pipeline Status\n // ================================================================\n\n private buildPipelineStatus(runs: Record<string, unknown>[]): void {\n const activeRuns = runs.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'in progress' || status === 'processing';\n });\n\n const recentErrors = runs.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n });\n\n if (activeRuns.length > 0) {\n this.PipelineStatusText = `${activeRuns.length} pipeline${activeRuns.length > 1 ? 's' : ''} running`;\n this.PipelineStatusOk = true;\n } else if (recentErrors.length > 0) {\n this.PipelineStatusText = `${recentErrors.length} recent error${recentErrors.length > 1 ? 's' : ''}`;\n this.PipelineStatusOk = false;\n } else {\n this.PipelineStatusText = 'All systems operational';\n this.PipelineStatusOk = true;\n }\n }\n\n // ================================================================\n // Drill-Down Data Loading\n // ================================================================\n\n private loadDrillDownData(key: string): void {\n this.DrillDownHasActions = false;\n\n switch (key) {\n case 'kpi-totalTags':\n this.DrillDownColumns = ['Name', 'Display Name', 'Description', 'Parent'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawTags.slice(0, 50).map(t => ({\n 'Name': String(t['Name'] || ''),\n 'Display Name': String(t['DisplayName'] || ''),\n 'Description': String(t['Description'] || '').slice(0, 100),\n 'Parent': String(t['Parent'] || 'Root'),\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n }));\n break;\n\n case 'kpi-itemsProcessed':\n this.DrillDownColumns = ['Name', 'Source', 'Content Type', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawContentItems.slice(0, 50).map(i => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(i['ContentSourceID']));\n const ct = this.rawContentTypes.find(t => String(t['ID']) === String(i['ContentTypeID']));\n return {\n 'Name': String(i['Name'] || ''),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Content Type': ct ? String(ct['Name']) : 'Unknown',\n 'Created': i['__mj_CreatedAt'] ? new Date(String(i['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(i['ID'] || ''),\n '_EntityName': 'MJ: Content Items',\n };\n });\n break;\n\n case 'kpi-avgConfidence':\n case 'kpi-coverage':\n this.DrillDownColumns = ['Tag', 'Item', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawContentItemTags.slice(0, 50).map(t => ({\n 'Tag': String(t['Tag'] || ''),\n 'Item': String(t['Item'] || ''),\n 'Weight': String(t['Weight'] || '0'),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Content Item Tags',\n }));\n break;\n\n case 'tagGrowth':\n case 'contentCoverage':\n case 'qualityScore':\n case 'sourcePerformance':\n case 'dailyThroughput':\n case 'taxonomyHealth':\n this.buildWidgetDrillDown(key);\n break;\n\n default:\n // D10: Handle tab-specific drill-down keys\n if (key.startsWith('tag-row:')) {\n this.buildTagRowDrillDown(key.replace('tag-row:', ''));\n } else if (key.startsWith('source-row:')) {\n this.buildSourceRowDrillDown(key.replace('source-row:', ''));\n } else if (key.startsWith('pipeline-throughput:')) {\n this.buildPipelineThroughputDrillDown(key.replace('pipeline-throughput:', ''));\n } else if (key.startsWith('quality-bin:')) {\n this.buildQualityBinDrillDown(key.replace('quality-bin:', ''));\n } else {\n this.DrillDownColumns = [];\n this.DrillDownData = [];\n }\n }\n\n this.IsDrillDownLoading = false;\n this.cdr.detectChanges();\n }\n\n private buildWidgetDrillDown(key: string): void {\n switch (key) {\n case 'tagGrowth':\n this.DrillDownColumns = ['Tag Name', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawTags\n .sort((a, b) => new Date(String(b['__mj_CreatedAt'] || 0)).getTime() - new Date(String(a['__mj_CreatedAt'] || 0)).getTime())\n .slice(0, 50)\n .map(t => ({\n 'Tag Name': String(t['Name'] || ''),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n }));\n break;\n\n case 'contentCoverage':\n this.DrillDownColumns = ['Content Type', 'Total Items', 'Tagged Items', 'Coverage %'];\n this.DrillDownData = this.CoverageData.map(c => ({\n 'Content Type': c.Name,\n 'Total Items': c.Total,\n 'Tagged Items': c.Tagged,\n 'Coverage %': `${c.Percentage}%`,\n }));\n break;\n\n case 'qualityScore':\n this.DrillDownColumns = ['Bin', 'Count'];\n this.DrillDownData = this.ConfidenceHistogram.map(b => ({\n 'Bin': b.Label,\n 'Count': b.Count,\n }));\n break;\n\n case 'sourcePerformance':\n this.DrillDownColumns = ['Source', 'Avg Tags/Item'];\n this.DrillDownData = this.SourcePerfData.map(s => ({\n 'Source': s.Name,\n 'Avg Tags/Item': s.AvgTagsPerItem,\n }));\n break;\n\n case 'dailyThroughput':\n this.DrillDownColumns = ['Run ID', 'Source', 'Status', 'Items', 'Started'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawProcessRuns\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 30)\n .map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n return {\n 'Run ID': String(r['ID'] || '').slice(0, 14),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Status': String(r['Status'] || ''),\n 'Items': Number(r['ProcessedItems'] || 0),\n 'Started': r['StartTime'] ? new Date(String(r['StartTime'])).toLocaleString() : '',\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n break;\n\n case 'taxonomyHealth':\n this.DrillDownColumns = ['Tag', 'Has Children', 'Is Used', 'Status'];\n this.DrillDownHasActions = true;\n const parentIds = new Set(this.rawTags.filter(t => t['ParentID']).map(t => String(t['ParentID'])));\n const usedIds = new Set(this.rawContentItemTags.filter(ct => ct['TagID']).map(ct => String(ct['TagID'])));\n this.DrillDownData = this.rawTags.slice(0, 50).map(t => {\n const tid = String(t['ID']);\n const hasChildren = parentIds.has(tid);\n const isUsed = usedIds.has(tid);\n let status = 'Orphaned';\n if (hasChildren || isUsed) status = 'Healthy';\n else if (t['ParentID']) status = 'Attention';\n return {\n 'Tag': String(t['Name'] || ''),\n 'Has Children': hasChildren ? 'Yes' : 'No',\n 'Is Used': isUsed ? 'Yes' : 'No',\n 'Status': status,\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n };\n });\n break;\n }\n }\n\n // ================================================================\n // D10: Tab-Specific Drill-Down Builders\n // ================================================================\n\n /**\n * D10 Tags tab: Click a tag row to see content items using that tag.\n */\n private buildTagRowDrillDown(tagName: string): void {\n this.DrillDownColumns = ['Item Name', 'Source', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n\n const matchingTags = this.rawContentItemTags.filter(\n t => String(t['Tag'] || '') === tagName\n );\n\n this.DrillDownData = matchingTags.slice(0, 50).map(t => {\n const itemId = String(t['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n const source = item\n ? this.rawContentSources.find(s => String(s['ID']) === String(item['ContentSourceID']))\n : null;\n return {\n 'Item Name': item ? String(item['Name'] || '') : 'Unknown',\n 'Source': source ? String(source['Name'] || '') : 'Unknown',\n 'Weight': String(t['Weight'] || '0'),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': itemId,\n '_EntityName': 'MJ: Content Items',\n };\n });\n }\n\n /**\n * D10 Sources tab: Click a source row to see recent runs, items, and errors.\n */\n private buildSourceRowDrillDown(sourceName: string): void {\n const source = this.rawContentSources.find(s => String(s['Name']) === sourceName);\n if (!source) {\n this.DrillDownColumns = [];\n this.DrillDownData = [];\n return;\n }\n\n const sid = String(source['ID']);\n const sourceRuns = this.rawProcessRuns\n .filter(r => String(r['SourceID']) === sid)\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 20);\n\n this.DrillDownColumns = ['Status', 'Items Processed', 'Start Time', 'Duration'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = sourceRuns.map(r => {\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : null;\n const endTime = r['EndTime'] ? new Date(String(r['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n return {\n 'Status': String(r['Status'] || 'Unknown'),\n 'Items Processed': Number(r['ProcessedItems'] || 0),\n 'Start Time': startTime ? startTime.toLocaleString() : '',\n 'Duration': durationStr,\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n }\n\n /**\n * D10 Pipeline tab: Click throughput chart to see individual run details.\n */\n private buildPipelineThroughputDrillDown(dayIndex: string): void {\n const idx = parseInt(dayIndex, 10);\n const now = new Date();\n const targetDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (29 - idx));\n const dayStr = targetDate.toISOString().slice(0, 10);\n\n const dayRuns = this.rawProcessRuns.filter(r => {\n const st = r['StartTime'];\n return st && String(st).slice(0, 10) === dayStr;\n });\n\n this.DrillDownColumns = ['Run ID', 'Source', 'Status', 'Items', 'Start Time'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = dayRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n return {\n 'Run ID': String(r['ID'] || '').slice(0, 14),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Status': String(r['Status'] || ''),\n 'Items': Number(r['ProcessedItems'] || 0),\n 'Start Time': r['StartTime'] ? new Date(String(r['StartTime'])).toLocaleString() : '',\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n }\n\n /**\n * D10 Quality tab: Click confidence histogram bin to see matching items.\n */\n private buildQualityBinDrillDown(binLabel: string): void {\n // Parse bin range from label like \"0.7-0.8\"\n const parts = binLabel.split('-');\n const lo = parseFloat(parts[0]);\n const hi = parts.length > 1 ? parseFloat(parts[1]) : lo + 0.1;\n\n const matchingTags = this.rawContentItemTags.filter(t => {\n const w = Number(t['Weight'] || 0);\n return w >= lo && w < hi;\n });\n\n this.DrillDownColumns = ['Tag', 'Item', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = matchingTags.slice(0, 50).map(t => ({\n 'Tag': String(t['Tag'] || ''),\n 'Item': String(t['Item'] || ''),\n 'Weight': String(Number(t['Weight'] || 0).toFixed(3)),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Content Item Tags',\n }));\n }\n\n // ================================================================\n // D1: Cost & Usage Aggregation\n // ================================================================\n\n /**\n * Aggregates cost and token data from ContentProcessRunDetail records.\n * Each detail record has TotalTokensUsed and TotalCost fields that are\n * pre-rolled-up from linked AIPromptRun records.\n */\n private buildCostUsageData(filteredRuns: Record<string, unknown>[]): void {\n // Filter run details to match the current date range by joining to filtered runs\n const filteredRunIds = new Set(filteredRuns.map(r => String(r['ID'] || '')));\n const filteredDetails = this.rawRunDetails.filter(\n d => filteredRunIds.has(String(d['ContentProcessRunID'] || ''))\n );\n\n const totalTokens = this.sumField(filteredDetails, 'TotalTokensUsed');\n const totalCost = this.sumField(filteredDetails, 'TotalCost');\n const runCount = filteredRuns.length;\n const avgCostPerRun = runCount > 0 ? totalCost / runCount : 0;\n\n this.CostKPIs = [\n {\n Label: 'Total Tokens Used',\n Value: this.formatLargeNumber(totalTokens),\n Icon: 'fa-solid fa-microchip',\n SubLabel: `Across ${runCount} run${runCount !== 1 ? 's' : ''}`,\n },\n {\n Label: 'Total Cost',\n Value: totalCost > 0 ? `$${totalCost.toFixed(4)}` : '$0.00',\n Icon: 'fa-solid fa-dollar-sign',\n SubLabel: 'Estimated from AI model usage',\n },\n {\n Label: 'Avg Cost / Run',\n Value: avgCostPerRun > 0 ? `$${avgCostPerRun.toFixed(4)}` : '$0.00',\n Icon: 'fa-solid fa-calculator',\n SubLabel: runCount > 0 ? `${runCount} total runs` : 'No runs yet',\n },\n ];\n\n // Build per-run cost breakdown from detail records\n this.CostPerRunRows = this.buildCostPerRunRows(filteredRuns, filteredDetails);\n }\n\n /** Sum a numeric field across an array of raw records */\n public static SumField(records: Record<string, unknown>[], fieldName: string): number {\n return records.reduce((sum, r) => sum + Number(r[fieldName] || 0), 0);\n }\n\n private sumField(records: Record<string, unknown>[], fieldName: string): number {\n return AnalyticsResourceComponent.SumField(records, fieldName);\n }\n\n private formatLargeNumber(n: number): string {\n if (n >= 1000000) return `${(n / 1000000).toFixed(1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n return String(Math.round(n));\n }\n\n private buildCostPerRunRows(\n runs: Record<string, unknown>[],\n details: Record<string, unknown>[],\n ): { RunID: string; Source: string; Tokens: number; Cost: number; Started: string }[] {\n // Group details by run\n const detailsByRun = new Map<string, Record<string, unknown>[]>();\n for (const d of details) {\n const runId = String(d['ContentProcessRunID'] || '');\n if (!detailsByRun.has(runId)) detailsByRun.set(runId, []);\n detailsByRun.get(runId)!.push(d);\n }\n\n return runs\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 20)\n .map(run => {\n const runId = String(run['ID'] || '');\n const runDetails = detailsByRun.get(runId) || [];\n const tokens = this.sumField(runDetails, 'TotalTokensUsed');\n const cost = this.sumField(runDetails, 'TotalCost');\n const source = this.rawContentSources.find(s => String(s['ID']) === String(run['SourceID']));\n\n return {\n RunID: runId.slice(0, 14),\n Source: source ? String(source['Name']) : 'Unknown',\n Tokens: tokens,\n Cost: cost,\n Started: run['StartTime'] ? new Date(String(run['StartTime'])).toLocaleString() : '',\n };\n });\n }\n\n // ================================================================\n // D5: Print-Friendly Export\n // ================================================================\n\n /**\n * D5: Opens the browser print dialog with print-friendly CSS.\n * This is a zero-dependency approach to PDF export.\n * NOTE: For full XLSX export, an xlsx library (e.g. SheetJS) can be added later.\n */\n public PrintCurrentTab(): void {\n window.print();\n }\n\n // ================================================================\n // SR-6: Preference Persistence\n // ================================================================\n\n private static readonly PREFS_KEY = 'KH_Analytics_Preferences';\n\n private persistAnalyticsPreferences(): void {\n const prefs = JSON.stringify({\n ActiveTab: this.ActiveTab,\n ActiveDateRange: this.ActiveDateRange,\n EntityFilter: this.EntityFilter,\n });\n UserInfoEngine.Instance.SetSettingDebounced(AnalyticsResourceComponent.PREFS_KEY, prefs);\n }\n\n private loadAnalyticsPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(AnalyticsResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n if (prefs.ActiveTab) this.ActiveTab = prefs.ActiveTab;\n if (prefs.ActiveDateRange) this.ActiveDateRange = prefs.ActiveDateRange;\n if (prefs.EntityFilter) this.EntityFilter = prefs.EntityFilter;\n } catch { /* ignore */ }\n }\n }\n\n // ================================================================\n // Co-Occurrence Data\n // ================================================================\n\n /**\n * Load the top 20 co-occurring tag pairs and the staleness timestamp.\n * Runs in background so it does not block initial render.\n */\n private async loadCoOccurrenceData(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<{\n TagA: string; TagB: string; CoOccurrenceCount: number; LastComputedAt: string | null;\n }>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: 'CoOccurrenceCount > 0',\n OrderBy: 'CoOccurrenceCount DESC',\n MaxRows: 20,\n Fields: ['TagA', 'TagB', 'CoOccurrenceCount', 'LastComputedAt'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n const maxCount = result.Results[0].CoOccurrenceCount;\n this.CoOccurrencePairs = result.Results.map(row => ({\n TagAName: row.TagA,\n TagBName: row.TagB,\n Count: row.CoOccurrenceCount,\n BarWidth: maxCount > 0 ? Math.round((row.CoOccurrenceCount / maxCount) * 100) : 0,\n }));\n\n // Find the most recent LastComputedAt value for staleness indicator\n const computedDates = result.Results\n .map(r => r.LastComputedAt)\n .filter((d): d is string => d != null)\n .map(d => new Date(d))\n .filter(d => !isNaN(d.getTime()));\n\n if (computedDates.length > 0) {\n const latest = new Date(Math.max(...computedDates.map(d => d.getTime())));\n this.CoOccurrenceLastComputed = this.formatRelativeTime(latest);\n }\n }\n this.cdr.detectChanges();\n } catch (error) {\n console.error('[Analytics] Error loading co-occurrence data:', error);\n }\n }\n\n /** Recompute co-occurrence data (triggered by user button click) */\n public async RecomputeCoOccurrence(): Promise<void> {\n if (this.IsRecomputingCoOccurrence) return;\n this.IsRecomputingCoOccurrence = true;\n this.cdr.detectChanges();\n\n try {\n const provider = Metadata.Provider as unknown;\n const gql = `\n mutation RecomputeTagCoOccurrence {\n RecomputeTagCoOccurrence {\n PairsUpdated\n PairsDeleted\n }\n }\n `;\n // If GraphQL mutation not available, fall back to client-side reload\n try {\n const gqlProvider = provider as { ExecuteGQL: (query: string, variables: Record<string, unknown>) => Promise<unknown> };\n if (typeof gqlProvider.ExecuteGQL === 'function') {\n await gqlProvider.ExecuteGQL(gql, {});\n }\n } catch {\n // Mutation not available on server, just reload\n }\n\n // Reload the data\n await this.loadCoOccurrenceData();\n } finally {\n this.IsRecomputingCoOccurrence = false;\n this.cdr.detectChanges();\n }\n }\n\n // NOTE: formatRelativeTime is defined above in the Source Detail section.\n}\n\n/** Tree-shaking prevention */\nexport function LoadAnalyticsResource(): void {\n // Prevents tree-shaking\n}\n","@if (IsLoading) {\n <div class=\"analytics-loading\">\n <mj-loading text=\"Loading analytics data...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"analytics-layout\">\n <!-- =============== LEFT SIDEBAR =============== -->\n <aside class=\"analytics-sidebar\">\n <div class=\"sidebar-header\">\n <h2><i class=\"fa-solid fa-chart-line\"></i> Analytics</h2>\n </div>\n\n <nav class=\"sidebar-nav\">\n @for (nav of NavItems; track nav.ID) {\n <button\n class=\"nav-item\"\n [class.active]=\"ActiveTab === nav.ID\"\n (click)=\"SelectTab(nav.ID)\"\n >\n <i [class]=\"nav.Icon\"></i> {{ nav.Label }}\n </button>\n }\n </nav>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Trending Tags Cloud -->\n <div class=\"trending-section\">\n <h3><i class=\"fa-solid fa-arrow-trend-up\"></i> Trending Tags</h3>\n <div class=\"tag-cloud\">\n @for (tag of TrendingTags; track tag.Name) {\n <span [style.font-size.px]=\"tag.Size\" [style.font-weight]=\"tag.Weight\">{{ tag.Name }}</span>\n }\n @if (TrendingTags.length === 0) {\n <span class=\"no-trending\">No trending tags yet</span>\n }\n </div>\n </div>\n\n <!-- Pipeline Status -->\n <div class=\"pipeline-status\">\n <span class=\"status-dot\" [class.status-dot-error]=\"!PipelineStatusOk\"></span>\n {{ PipelineStatusText }}\n </div>\n </aside>\n\n <!-- =============== MAIN CONTENT =============== -->\n <div class=\"main-content\">\n\n <!-- ====================================================== -->\n <!-- TAB 1: OVERVIEW -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'overview') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-grip\"></i>\n <h1>Overview</h1>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"date-chips\">\n @for (range of DateRanges; track range.Label) {\n <button\n class=\"date-chip\"\n [class.active]=\"ActiveDateRange === range.Label\"\n (click)=\"SetDateRange(range.Label)\"\n >{{ range.Label }}</button>\n }\n </div>\n <select class=\"filter-dropdown\" [ngModel]=\"EntityFilter\" (ngModelChange)=\"SetEntityFilter($event)\">\n @for (opt of EntityFilterOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n\n <!-- KPI Cards -->\n <div class=\"kpi-row\">\n @for (kpi of KPIs; track kpi.Label) {\n <div class=\"kpi-card\" (click)=\"OpenDrillDown(kpi.DrillDownKey)\">\n <div>\n <div class=\"kpi-label\">{{ kpi.Label }}</div>\n <div class=\"kpi-value\">{{ kpi.Value }}</div>\n <div class=\"kpi-delta\" [class.up]=\"kpi.DeltaDirection === 'up'\" [class.down]=\"kpi.DeltaDirection === 'down'\">\n @if (kpi.DeltaDirection === 'up') {\n <i class=\"fa-solid fa-arrow-up\" style=\"font-size:9px\"></i>\n } @else if (kpi.DeltaDirection === 'down') {\n <i class=\"fa-solid fa-arrow-down\" style=\"font-size:9px\"></i>\n }\n {{ kpi.Delta }}\n </div>\n </div>\n <div class=\"kpi-sparkline\">\n <svg width=\"64\" height=\"28\" viewBox=\"0 0 64 28\">\n <polyline [attr.points]=\"kpi.SparklinePoints\" fill=\"none\" [attr.stroke]=\"kpi.SparklineColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n </div>\n\n <!-- KPI Drill-Down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('kpi-')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Detail View</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of DrillDownColumns; track col) {\n <th>{{ col }}</th>\n }\n @if (DrillDownHasActions) {\n <th class=\"drill-action-col\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) {\n <td>{{ row[col] }}</td>\n }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No data available</div>\n }\n </div>\n }\n\n <!-- Widget Cards Grid (2x3) -->\n <div class=\"cards-grid\">\n\n <!-- Card 1: Tag Growth -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('tagGrowth')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-chart-line\"></i> Tag Growth</div>\n <div class=\"bar-chart\">\n @for (bar of TagGrowthData; track bar.Label) {\n <div class=\"bar-col\">\n <div class=\"bar-value\">{{ bar.Count }}</div>\n <div class=\"bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.opacity]=\"0.5 + (bar.Percentage / 200)\"></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Card 2: Content Coverage -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('contentCoverage')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-bullseye\"></i> Content Coverage</div>\n <div class=\"rings-grid\">\n @for (entity of CoverageData; track entity.Name) {\n <div class=\"ring-item\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\">\n <circle cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"5\"/>\n <circle cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" [attr.stroke]=\"entity.Color\" stroke-width=\"5\"\n [attr.stroke-dasharray]=\"entity.StrokeDash\" stroke-dashoffset=\"31.4\" stroke-linecap=\"round\"\n transform=\"rotate(-90 24 24)\"/>\n <text x=\"24\" y=\"26\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"700\" fill=\"var(--mj-text-primary)\">{{ entity.Percentage }}%</text>\n </svg>\n <div>\n <div class=\"ring-label\">{{ entity.Name }}</div>\n <div class=\"ring-stat\">{{ FormatNumber(entity.Tagged) }} / {{ FormatNumber(entity.Total) }}</div>\n </div>\n </div>\n }\n @if (CoverageData.length === 0) {\n <div class=\"widget-empty\">No content types found</div>\n }\n </div>\n </div>\n\n <!-- Card 3: Quality Score Gauge -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('qualityScore')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-gauge-high\"></i> Quality Score</div>\n <div class=\"gauge-container\">\n <svg width=\"180\" height=\"110\" viewBox=\"0 0 180 110\">\n <!-- Background arc -->\n <path d=\"M 20 95 A 70 70 0 0 1 160 95\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"14\" stroke-linecap=\"round\"/>\n <!-- Zone arcs -->\n <path d=\"M 20 95 A 70 70 0 0 1 48.6 35.2\" fill=\"none\" stroke=\"var(--mj-status-error)\" stroke-width=\"14\" stroke-linecap=\"round\" opacity=\"0.3\"/>\n <path d=\"M 48.6 35.2 A 70 70 0 0 1 118 28\" fill=\"none\" stroke=\"var(--mj-status-warning)\" stroke-width=\"14\" opacity=\"0.3\"/>\n <path d=\"M 118 28 A 70 70 0 0 1 160 95\" fill=\"none\" stroke=\"var(--mj-status-success)\" stroke-width=\"14\" stroke-linecap=\"round\" opacity=\"0.3\"/>\n <!-- Score text -->\n <text x=\"90\" y=\"88\" text-anchor=\"middle\" font-size=\"26\" font-weight=\"800\" fill=\"var(--mj-text-primary)\">{{ QualityScore }}</text>\n <text x=\"90\" y=\"105\" text-anchor=\"middle\" font-size=\"10\" fill=\"var(--mj-text-muted)\">out of 100</text>\n <text x=\"28\" y=\"108\" font-size=\"8\" fill=\"var(--mj-text-muted)\">0</text>\n <text x=\"86\" y=\"18\" font-size=\"8\" fill=\"var(--mj-text-muted)\">50</text>\n <text x=\"155\" y=\"108\" font-size=\"8\" fill=\"var(--mj-text-muted)\">100</text>\n </svg>\n </div>\n <!-- Mini confidence histogram -->\n <div class=\"mini-histogram\">\n @for (bin of MiniConfidenceBins; track TrackByIndex($index)) {\n <div class=\"mini-hist-bar\" [style.height.px]=\"bin.Height\" [style.background]=\"bin.Color\" [title]=\"bin.Title\"></div>\n }\n </div>\n <div class=\"mini-hist-label\">Confidence Distribution</div>\n </div>\n\n <!-- Card 4: Source Performance -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('sourcePerformance')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-ranking-star\"></i> Source Performance</div>\n <div class=\"h-bar-list\">\n @for (source of SourcePerfData; track source.Name) {\n <div class=\"h-bar-row\">\n <div class=\"h-bar-name\">{{ source.Name }}</div>\n <div class=\"h-bar-track\">\n <div class=\"h-bar-fill\" [style.width.%]=\"source.Percentage\" [style.background]=\"source.Color\">{{ source.AvgTagsPerItem }}</div>\n </div>\n </div>\n }\n @if (SourcePerfData.length === 0) {\n <div class=\"widget-empty\">No source data</div>\n }\n </div>\n <div class=\"widget-footnote\">Average tags per item</div>\n </div>\n\n <!-- Card 5: Daily Throughput -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('dailyThroughput')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-bolt\"></i> Daily Throughput</div>\n <div class=\"throughput-bars\">\n @for (day of ThroughputData; track day.Label) {\n <div class=\"tp-bar\"\n [style.height.%]=\"day.Percentage\"\n [style.background]=\"day.IsError ? 'var(--mj-status-error)' : 'var(--mj-status-success)'\"\n >\n <span class=\"tp-bar-label\">{{ day.Label }}</span>\n </div>\n }\n </div>\n <div class=\"legend\">\n <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--mj-status-success)\"></div> Success</div>\n <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--mj-status-error)\"></div> Failures</div>\n </div>\n </div>\n\n <!-- Card 6: Taxonomy Health -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('taxonomyHealth')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-sitemap\"></i> Taxonomy Health</div>\n <div class=\"taxonomy-ring-container\">\n <svg width=\"140\" height=\"140\" viewBox=\"0 0 140 140\">\n <circle cx=\"70\" cy=\"70\" r=\"54\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"18\"/>\n @for (seg of TaxonomyRingSegments; track TrackByIndex($index)) {\n <circle cx=\"70\" cy=\"70\" r=\"54\" fill=\"none\"\n [attr.stroke]=\"seg.Color\" stroke-width=\"18\"\n [attr.stroke-dasharray]=\"seg.StrokeDash\"\n [attr.stroke-dashoffset]=\"seg.StrokeOffset\"\n transform=\"rotate(-90 70 70)\"/>\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" font-size=\"22\" font-weight=\"800\" fill=\"var(--mj-text-primary)\">{{ TaxonomyTotal }}</text>\n <text x=\"70\" y=\"82\" text-anchor=\"middle\" font-size=\"10\" fill=\"var(--mj-text-muted)\">total tags</text>\n </svg>\n </div>\n <div class=\"taxonomy-stats\">\n @for (stat of TaxonomyStats; track stat.Label) {\n <div class=\"tax-stat\" [style.background]=\"stat.BgColor\" [style.color]=\"stat.Color\">\n {{ stat.Count }}<small>{{ stat.Label }}</small>\n </div>\n }\n </div>\n </div>\n\n </div><!-- /cards-grid -->\n\n <!-- Widget Drill-Down -->\n @if (DrillDownTarget && !DrillDownTarget.startsWith('kpi-')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> {{ DrillDownTarget }} Detail</span>\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of DrillDownColumns; track col) {\n <th>{{ col }}</th>\n }\n @if (DrillDownHasActions) {\n <th class=\"drill-action-col\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) {\n <td>{{ row[col] }}</td>\n }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No data available</div>\n }\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 2: TAGS -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'tags') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-tags\"></i>\n <h1>Tags</h1>\n </div>\n\n <!-- Top 20 Tags Table -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <div class=\"sub-section-header\">\n <h3><i class=\"fa-solid fa-trophy\"></i> Top 20 Tags</h3>\n @if (TopTags.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportTabDataCSV('top-tags')\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n </div>\n @if (TopTags.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>Tag Name</th>\n <th class=\"num\">Usage Count</th>\n <th>Avg Weight</th>\n <th>Trend</th>\n <th>Top Entity</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (tag of TopTags; track tag.Name) {\n <tr style=\"cursor:pointer\" (click)=\"OpenDrillDown('tag-row:' + tag.Name)\">\n <td>{{ tag.Rank }}</td>\n <td><strong>{{ tag.Name }}</strong></td>\n <td class=\"num\">{{ FormatNumber(tag.UsageCount) }}</td>\n <td>\n <span class=\"weight-bar\" [style.width.px]=\"tag.WeightBarWidth\" [style.background]=\"tag.WeightBarColor\"></span>\n {{ tag.AvgWeight }}\n </td>\n <td>\n <svg width=\"48\" height=\"16\">\n <polyline [attr.points]=\"tag.TrendPoints\" fill=\"none\" [attr.stroke]=\"tag.TrendColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </td>\n <td>{{ tag.TopEntity }}</td>\n <td class=\"muted\">{{ tag.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-tags\"></i>\n <p>No tag data available yet. Process content to generate tags.</p>\n </div>\n }\n </div>\n\n <!-- D10: Tags tab drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('tag-row:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Content Items Tagged \"{{ DrillDownTarget.replace('tag-row:', '') }}\"</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No items found for this tag</div>\n }\n </div>\n }\n\n <!-- Tag Distribution by Entity -->\n @if (EntityDistribution.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Tag Distribution by Entity</h3>\n <div class=\"stacked-bar-chart\">\n @for (row of EntityDistribution; track row.EntityName) {\n <div class=\"stacked-row\">\n <div class=\"stacked-label\">{{ row.EntityName }}</div>\n <div class=\"stacked-track\">\n @for (seg of row.Segments; track TrackByIndex($index)) {\n <div class=\"stacked-seg\" [style.width.%]=\"seg.Percentage\" [style.background]=\"seg.Color\" [title]=\"seg.Label + ': ' + seg.Percentage + '%'\">{{ seg.Label }}</div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"legend\" style=\"margin-top:12px\">\n @for (item of DistributionLegend; track item.Label) {\n <div class=\"legend-item\"><div class=\"legend-dot\" [style.background]=\"item.Color\"></div> {{ item.Label }}</div>\n }\n </div>\n </div>\n }\n\n <!-- Tag Depth Distribution -->\n @if (TagDepthBars.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Tag Depth Distribution</h3>\n <div class=\"v-bar-chart\">\n @for (bar of TagDepthBars; track bar.Label) {\n <div class=\"v-bar-col\">\n <div class=\"v-bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.min-height.px]=\"bar.Count > 0 ? 24 : 0\">{{ bar.Count }}</div>\n <div class=\"v-bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n <div class=\"chart-footnote\">\n Taxonomy hierarchy depth -- Most tags at depth 2-3 indicating a healthy mid-level structure\n </div>\n </div>\n }\n\n <!-- Frequently Paired Tags (Co-Occurrence) -->\n <div class=\"sub-section co-occurrence-section\">\n <div class=\"sub-section-header\">\n <h3><i class=\"fa-solid fa-link\"></i> Frequently Paired Tags</h3>\n <div class=\"co-occurrence-actions\">\n @if (CoOccurrenceLastComputed) {\n <span class=\"co-occurrence-staleness\" title=\"Last computed timestamp\">\n <i class=\"fa-regular fa-clock\"></i>\n Last computed: {{ CoOccurrenceLastComputed }}\n </span>\n }\n <button class=\"drill-export-btn\" (click)=\"RecomputeCoOccurrence()\" [disabled]=\"IsRecomputingCoOccurrence\" title=\"Recompute co-occurrence data\">\n @if (IsRecomputingCoOccurrence) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Computing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Recompute\n }\n </button>\n </div>\n </div>\n @if (CoOccurrencePairs.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>Tag A</th>\n <th>Tag B</th>\n <th class=\"num\">Co-Occurrences</th>\n <th>Frequency</th>\n </tr>\n </thead>\n <tbody>\n @for (pair of CoOccurrencePairs; track pair.TagAName + pair.TagBName; let i = $index) {\n <tr>\n <td class=\"muted\">{{ i + 1 }}</td>\n <td><strong>{{ pair.TagAName }}</strong></td>\n <td><strong>{{ pair.TagBName }}</strong></td>\n <td class=\"num\">{{ FormatNumber(pair.Count) }}</td>\n <td>\n <span class=\"weight-bar\" [style.width.px]=\"pair.BarWidth\" style=\"background: var(--mj-status-info)\"></span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No co-occurrence data available yet. Process content and recompute to see which tags frequently appear together.</p>\n </div>\n }\n </div>\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 3: SOURCES -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'sources') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-database\"></i>\n <h1>Sources</h1>\n </div>\n\n <!-- Source Comparison Table -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-table\"></i> Source Comparison</h3>\n @if (SourceComparison.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Source Name</th>\n <th>Type</th>\n <th class=\"num\">Items</th>\n <th class=\"num\">Tags Generated</th>\n <th class=\"num\">Avg Tags/Item</th>\n <th class=\"num\">Avg Weight</th>\n <th>Last Run</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n @for (source of SourceComparison; track source.Name) {\n <tr (click)=\"SelectSource(source.Name); OpenDrillDown('source-row:' + source.Name)\" style=\"cursor:pointer\" [class.source-selected]=\"SelectedSourceName === source.Name\">\n <td><strong>{{ source.Name }}</strong></td>\n <td><i [class]=\"source.TypeIcon\" [style.color]=\"source.TypeColor\" style=\"margin-right:4px\"></i> {{ source.Type }}</td>\n <td class=\"num\">{{ FormatNumber(source.Items) }}</td>\n <td class=\"num\">{{ FormatNumber(source.TagsGenerated) }}</td>\n <td class=\"num\">{{ source.AvgTagsPerItem }}</td>\n <td class=\"num\">{{ source.AvgWeight }}</td>\n <td class=\"muted\">{{ source.LastRun }}</td>\n <td><span class=\"badge\" [class]=\"source.StatusClass\"><i class=\"fa-solid fa-circle\" style=\"font-size:6px;margin-right:3px\"></i> {{ source.Status }}</span></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No content sources configured yet.</p>\n </div>\n }\n </div>\n\n <!-- D10: Sources tab drill-down (recent runs) -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('source-row:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Recent Runs: {{ DrillDownTarget.replace('source-row:', '') }}</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No run data for this source</div>\n }\n </div>\n }\n\n <!-- Per-Source Detail -->\n @if (SelectedSourceName && SourceComparison.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-area\"></i> Source Detail: {{ SelectedSourceName }}</h3>\n <div class=\"two-col\">\n <!-- Items Processed Over Time -->\n <div class=\"widget-card\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-chart-bar\"></i> Items Processed (Last 8 Weeks)</div>\n <div class=\"bar-chart\" style=\"height:100px\">\n @for (bar of SourceWeeklyBars; track bar.Label) {\n <div class=\"bar-col\">\n <div class=\"bar-value\" style=\"font-size:9px\">{{ bar.Value }}</div>\n <div class=\"bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.opacity]=\"0.5 + (bar.Percentage / 200)\"></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag Quality Distribution -->\n <div class=\"widget-card\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-star-half-stroke\"></i> Tag Quality Distribution</div>\n <div class=\"quality-bands\">\n @for (band of SourceQualityBands; track band.Label) {\n <div class=\"quality-band-row\">\n <span class=\"quality-band-label\">{{ band.Label }}</span>\n <div class=\"quality-band-track\">\n <div class=\"quality-band-fill\" [style.width.%]=\"band.Percentage\" [style.background]=\"band.Color\">{{ band.Percentage }}%</div>\n </div>\n </div>\n }\n </div>\n <div class=\"source-quality-note\">\n <i class=\"fa-solid fa-circle-info\" style=\"color:var(--mj-status-info);margin-right:4px\"></i>\n {{ SourceQualityNote }}\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Source Health -->\n @if (SourceHealthCards.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Source Health Summary</h3>\n <div class=\"source-health-grid\" [style.grid-template-columns]=\"'repeat(' + SourceHealthCards.length + ', 1fr)'\">\n @for (card of SourceHealthCards; track card.Name) {\n <div class=\"source-health-card\" [style.border-top-color]=\"card.Color\">\n <div class=\"health-card-name\">{{ card.Name }}</div>\n <div class=\"health-card-value\" [style.color]=\"card.Color\">{{ card.Uptime }}%</div>\n <div class=\"health-card-label\">uptime</div>\n </div>\n }\n </div>\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 4: PIPELINE -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'pipeline') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <h1>Pipeline</h1>\n </div>\n\n <!-- Pipeline Throughput Chart -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Pipeline Throughput (Last 30 Days)</h3>\n <div class=\"widget-card\">\n <div class=\"pipeline-throughput-bars\">\n @for (bar of PipelineThroughputBars; track TrackByIndex($index)) {\n <div class=\"pipeline-bar\"\n [style.height.%]=\"bar.Percentage\"\n [style.background]=\"bar.IsError ? 'var(--mj-status-error)' : 'var(--mj-brand-primary)'\"\n [style.opacity]=\"bar.IsError ? 0.7 : (0.6 + bar.Percentage / 300)\"\n style=\"cursor:pointer\"\n (click)=\"OpenDrillDown('pipeline-throughput:' + $index)\"\n ></div>\n }\n </div>\n <div class=\"pipeline-date-labels\">\n @for (label of PipelineDateLabels; track label) {\n <span>{{ label }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- D10: Pipeline throughput drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('pipeline-throughput:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Runs for Selected Day</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No runs for this day</div>\n }\n </div>\n }\n\n <!-- Processing Time Breakdown -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-stopwatch\"></i> Processing Time Breakdown (Avg per Item)</h3>\n <div class=\"widget-card\">\n <div class=\"stage-bars\">\n @for (stage of ProcessingStages; track stage.Name) {\n <div class=\"stage-row\">\n <div class=\"stage-name\">{{ stage.Name }}</div>\n <div class=\"stage-track\">\n <div class=\"stage-fill\" [style.width.%]=\"stage.Percentage\" [style.background]=\"stage.Color\">\n @if (stage.Percentage > 15) {\n {{ stage.Time }}s\n }\n </div>\n </div>\n <div class=\"stage-time\">{{ stage.Time }}s</div>\n </div>\n }\n </div>\n <div class=\"stage-summary\">\n <span><strong>Total avg:</strong> {{ TotalAvgProcessingTime }}s per item</span>\n @if (BottleneckStage) {\n <span class=\"stage-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:var(--mj-status-warning);margin-right:4px\"></i>\n {{ BottleneckStage }} stage is the bottleneck ({{ BottleneckPercent }}% of total time)\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Success Rate -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Success Rate Overview</h3>\n <div class=\"widget-card\">\n <div class=\"success-rate-display\">\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-status-success)\">\n {{ rawProcessRuns.length > 0 ? (100 - (ErrorLog.length / rawProcessRuns.length * 100)).toFixed(1) : '100' }}%\n </div>\n <div class=\"success-rate-label\">Success Rate</div>\n </div>\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-status-error)\">\n {{ rawProcessRuns.length > 0 ? (ErrorLog.length / rawProcessRuns.length * 100).toFixed(1) : '0' }}%\n </div>\n <div class=\"success-rate-label\">Failure Rate</div>\n </div>\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-text-primary)\">\n {{ FormatNumber(rawProcessRuns.length) }}\n </div>\n <div class=\"success-rate-label\">Total Runs</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Active Runs Table -->\n @if (ActiveRuns.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-spinner\"></i> Active Runs</h3>\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Run ID</th>\n <th>Source</th>\n <th>Started</th>\n <th>Progress</th>\n <th>Stage</th>\n <th class=\"num\">Items</th>\n </tr>\n </thead>\n <tbody>\n @for (run of ActiveRuns; track run.RunID) {\n <tr>\n <td class=\"monospace-cell\">{{ run.RunID }}</td>\n <td>{{ run.Source }}</td>\n <td class=\"muted\">{{ run.Started }}</td>\n <td>\n <div class=\"progress-track\"><div class=\"progress-fill\" [style.width.%]=\"run.Progress\" style=\"background:var(--mj-brand-primary)\"></div></div>\n <span class=\"progress-text\">{{ run.Progress }}%</span>\n </td>\n <td><span class=\"badge\" [class]=\"run.StageClass\">{{ run.Stage }}</span></td>\n <td class=\"num\">{{ FormatNumber(run.Items) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Error Log -->\n @if (ErrorLog.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> Recent Errors</h3>\n <div class=\"error-log\">\n @for (entry of ErrorLog; track TrackByIndex($index)) {\n <div class=\"error-entry\">\n <div class=\"error-time\">{{ entry.Time }}</div>\n <div class=\"error-source\">{{ entry.Source }}</div>\n <div class=\"error-msg\">{{ entry.Message }}</div>\n </div>\n }\n </div>\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 5: QUALITY -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'quality') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <h1>Quality</h1>\n </div>\n\n <!-- Confidence Distribution Histogram -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-chart-column\"></i> Confidence Distribution</h3>\n <div class=\"widget-card\">\n <div class=\"histogram\">\n @for (bin of ConfidenceHistogram; track bin.Label) {\n <div class=\"hist-bar-col\" style=\"cursor:pointer\" (click)=\"OpenDrillDown('quality-bin:' + bin.Label)\">\n <div class=\"hist-bar\" [style.height.%]=\"bin.Percentage\" [style.background]=\"bin.Color\">\n @if (bin.Count > 0) { {{ bin.Count }} }\n </div>\n <div class=\"hist-label\">{{ bin.Label }}</div>\n </div>\n }\n </div>\n <div class=\"confidence-stats\">\n @for (stat of ConfidenceStats; track stat.Label) {\n <span><strong>{{ stat.Label }}:</strong> {{ stat.Value }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- D10: Quality bin drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('quality-bin:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Items in Confidence Range {{ DrillDownTarget.replace('quality-bin:', '') }}</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No items in this confidence range</div>\n }\n </div>\n }\n\n <!-- Weight Distribution by Entity -->\n @if (WeightByEntity.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-weight-scale\"></i> Weight Distribution by Entity</h3>\n <div class=\"widget-card\">\n <div class=\"grouped-bar-chart\">\n @for (entity of WeightByEntity; track entity.Name) {\n <div class=\"grouped-col\">\n <div class=\"grouped-bars\">\n <div class=\"g-bar\" [style.height.%]=\"entity.High\" style=\"background:var(--mj-brand-primary)\" [title]=\"'High: ' + entity.High + '%'\"></div>\n <div class=\"g-bar\" [style.height.%]=\"entity.Med\" style=\"background:var(--mj-status-info)\" [title]=\"'Med: ' + entity.Med + '%'\"></div>\n <div class=\"g-bar\" [style.height.%]=\"entity.Low\" style=\"background:var(--mj-text-muted)\" [title]=\"'Low: ' + entity.Low + '%'\"></div>\n </div>\n <div class=\"grouped-label\">{{ entity.Name }}</div>\n </div>\n }\n </div>\n <div class=\"legend\" style=\"justify-content:center;margin-top:14px\">\n @for (item of WeightLegend; track item.Label) {\n <div class=\"legend-item\"><div class=\"legend-dot\" [style.background]=\"item.Color\"></div> {{ item.Label }}</div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Tag Accuracy Over Time -->\n @if (AccuracyLinePoints) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Tag Accuracy Over Time (Weekly Avg Confidence)</h3>\n <div class=\"widget-card\">\n <div class=\"accuracy-chart\">\n <div class=\"accuracy-y-labels\">\n <div>1.0</div>\n <div>0.75</div>\n <div>0.50</div>\n <div>0.25</div>\n </div>\n <div class=\"accuracy-area\">\n <div class=\"accuracy-grid-line\" style=\"top:33%\"></div>\n <div class=\"accuracy-grid-line\" style=\"top:66%\"></div>\n <svg width=\"100%\" height=\"110\" viewBox=\"0 0 400 110\" preserveAspectRatio=\"none\" class=\"accuracy-svg\">\n <polyline [attr.points]=\"AccuracyLinePoints\"\n fill=\"none\" stroke=\"var(--mj-brand-primary)\" stroke-width=\"2.5\" vector-effect=\"non-scaling-stroke\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n @for (dot of AccuracyDots; track TrackByIndex($index)) {\n <circle [attr.cx]=\"dot.Cx\" [attr.cy]=\"dot.Cy\" r=\"3\" fill=\"var(--mj-brand-primary)\"/>\n }\n </svg>\n </div>\n </div>\n <div class=\"accuracy-x-labels\">\n @for (label of AccuracyMonthLabels; track label) {\n <span>{{ label }}</span>\n }\n </div>\n <div class=\"accuracy-trend-text\">\n <i class=\"fa-solid fa-arrow-trend-up\" style=\"margin-right:4px\"></i>\n {{ AccuracyTrendText }}\n </div>\n </div>\n </div>\n }\n\n <!-- Low-Confidence Tags Table -->\n @if (LowConfidenceTags.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-exclamation-triangle\"></i> Low-Confidence Tags (Avg Weight &lt; 0.4)</h3>\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Tag Name</th>\n <th class=\"num\">Avg Weight</th>\n <th class=\"num\">Usage Count</th>\n <th>Top Entity</th>\n <th>Suggested Action</th>\n </tr>\n </thead>\n <tbody>\n @for (tag of LowConfidenceTags; track tag.Name) {\n <tr>\n <td><strong>{{ tag.Name }}</strong></td>\n <td class=\"num\">{{ tag.AvgWeight }}</td>\n <td class=\"num\">{{ tag.UsageCount }}</td>\n <td>{{ tag.TopEntity }}</td>\n <td><span class=\"badge\" [class]=\"tag.ActionClass\">{{ tag.SuggestedAction }}</span></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Model Performance Comparison -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-robot\"></i> Model Performance Comparison</h3>\n <div class=\"model-grid\">\n @for (model of ModelComparisons; track model.Name) {\n <div class=\"model-card\">\n <div class=\"model-name\"><i [class]=\"model.Icon\" [style.color]=\"model.IconColor\" style=\"margin-right:4px\"></i> {{ model.Name }}</div>\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" style=\"margin:4px 0\">\n <circle cx=\"40\" cy=\"40\" r=\"32\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"8\"/>\n <circle cx=\"40\" cy=\"40\" r=\"32\" fill=\"none\" [attr.stroke]=\"model.ScoreColor\" stroke-width=\"8\"\n [attr.stroke-dasharray]=\"model.StrokeDash\" stroke-dashoffset=\"50\"\n transform=\"rotate(-90 40 40)\" stroke-linecap=\"round\"/>\n </svg>\n <div class=\"model-score\" [style.color]=\"model.ScoreColor\">{{ model.ScorePercentage }}%</div>\n <div class=\"model-detail\">Avg confidence: {{ model.AvgConfidence }}</div>\n <div class=\"model-detail\">{{ FormatNumber(model.TagsGenerated) }} tags generated</div>\n <div class=\"model-detail\" [style.color]=\"model.RoleColor\" style=\"font-weight:600\">{{ model.Role }}</div>\n </div>\n }\n </div>\n @if (ModelRecommendation) {\n <div class=\"model-recommendation\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color:var(--mj-status-warning)\"></i>\n <div>\n <strong>Recommendation:</strong> {{ ModelRecommendation }}\n </div>\n </div>\n }\n </div>\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 6: COST & USAGE (D1) -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'cost') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h1>Cost & Usage</h1>\n <div class=\"tab-header-actions\">\n <button class=\"drill-export-btn\" (click)=\"ExportTabDataCSV('cost-usage')\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n <button class=\"drill-export-btn\" (click)=\"PrintCurrentTab()\" title=\"Print (PDF alternative)\">\n <i class=\"fa-solid fa-print\"></i> Print\n </button>\n </div>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"date-chips\">\n @for (range of DateRanges; track range.Label) {\n <button\n class=\"date-chip\"\n [class.active]=\"ActiveDateRange === range.Label\"\n (click)=\"SetDateRange(range.Label)\"\n >{{ range.Label }}</button>\n }\n </div>\n </div>\n\n <!-- KPI Cards -->\n @if (CostKPIs.length > 0) {\n <div class=\"cost-kpi-row\">\n @for (kpi of CostKPIs; track kpi.Label) {\n <div class=\"cost-kpi-card\">\n <div class=\"cost-kpi-icon\"><i [class]=\"kpi.Icon\"></i></div>\n <div>\n <div class=\"cost-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"cost-kpi-label\">{{ kpi.Label }}</div>\n <div class=\"cost-kpi-sub\">{{ kpi.SubLabel }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Per-Run Cost Table -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-table\"></i> Cost Breakdown by Run</h3>\n @if (CostPerRunRows.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Run ID</th>\n <th>Source</th>\n <th class=\"num\">Tokens</th>\n <th class=\"num\">Cost</th>\n <th>Started</th>\n </tr>\n </thead>\n <tbody>\n @for (row of CostPerRunRows; track row.RunID) {\n <tr>\n <td class=\"monospace-cell\">{{ row.RunID }}</td>\n <td>{{ row.Source }}</td>\n <td class=\"num\">{{ FormatNumber(row.Tokens) }}</td>\n <td class=\"num\">{{ row.Cost > 0 ? '$' + row.Cost.toFixed(4) : '$0.00' }}</td>\n <td class=\"muted\">{{ row.Started }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-coins\"></i>\n <p>No cost data available yet. Run the pipeline to generate cost and token usage metrics.</p>\n <p class=\"empty-state-hint\">Cost data is aggregated from ContentProcessRunDetail records linked to AI Prompt Runs.</p>\n </div>\n }\n </div>\n </section>\n }\n\n </div><!-- /main-content -->\n </div><!-- /analytics-layout -->\n}\n"]}
1
+ {"version":3,"file":"analytics-resource.component.js","sourceRoot":"","sources":["../../../../src/KnowledgeHub/components/analytics/analytics-resource.component.ts","../../../../src/KnowledgeHub/components/analytics/analytics-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Knowledge Hub Analytics & Insights Resource Component\n *\n * Multi-tab analytics dashboard for the Knowledge Hub: Overview (interactive cards),\n * Tags (top 20, distribution), Sources (comparison, health), Pipeline (throughput,\n * processing time, errors), and Quality (confidence, weight, model comparison).\n *\n * All chart rendering is pure CSS/inline SVG -- no JS chart libraries.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n\n// ================================================================\n// Interfaces\n// ================================================================\n\ninterface NavItem {\n ID: string;\n Label: string;\n Icon: string;\n}\n\ninterface DateRangeOption {\n Label: string;\n Days: number;\n}\n\ninterface KPIData {\n Label: string;\n Value: string;\n Delta: string;\n DeltaDirection: 'up' | 'down' | 'flat';\n SparklinePoints: string;\n SparklineColor: string;\n SparklineGradId: string;\n DrillDownKey: string;\n}\n\ninterface WidgetCard {\n Key: string;\n Title: string;\n Icon: string;\n}\n\ninterface TagGrowthMonth {\n Label: string;\n Count: number;\n Percentage: number;\n}\n\ninterface CoverageEntity {\n Name: string;\n Tagged: number;\n Total: number;\n Percentage: number;\n Color: string;\n StrokeDash: string;\n}\n\ninterface SourcePerformanceRow {\n Name: string;\n AvgTagsPerItem: number;\n Percentage: number;\n Color: string;\n}\n\ninterface ThroughputDay {\n Label: string;\n Percentage: number;\n IsError: boolean;\n}\n\ninterface TaxonomyStat {\n Label: string;\n Count: number;\n Color: string;\n BgColor: string;\n}\n\ninterface TopTagRow {\n Rank: number;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n WeightBarWidth: number;\n WeightBarColor: string;\n TrendPoints: string;\n TrendColor: string;\n TopEntity: string;\n FirstSeen: string;\n}\n\ninterface EntityDistributionRow {\n EntityName: string;\n Segments: EntityDistSegment[];\n}\n\ninterface EntityDistSegment {\n Label: string;\n Percentage: number;\n Color: string;\n}\n\ninterface TagDepthBar {\n Label: string;\n Count: number;\n Percentage: number;\n}\n\ninterface SourceComparisonRow {\n Name: string;\n Type: string;\n TypeIcon: string;\n TypeColor: string;\n Items: number;\n TagsGenerated: number;\n AvgTagsPerItem: number;\n AvgWeight: number;\n LastRun: string;\n Status: string;\n StatusClass: string;\n}\n\ninterface SourceHealthCard {\n Name: string;\n Uptime: number;\n Color: string;\n}\n\ninterface PipelineBar {\n Percentage: number;\n IsError: boolean;\n}\n\ninterface ProcessingStage {\n Name: string;\n Time: number;\n Percentage: number;\n Color: string;\n}\n\ninterface ActiveRunRow {\n RunID: string;\n Source: string;\n Started: string;\n Progress: number;\n Stage: string;\n StageClass: string;\n Items: number;\n}\n\ninterface ErrorLogEntry {\n Time: string;\n Source: string;\n Message: string;\n}\n\ninterface HistogramBin {\n Label: string;\n Count: number;\n Percentage: number;\n Color: string;\n}\n\ninterface WeightGroupedEntity {\n Name: string;\n High: number;\n Med: number;\n Low: number;\n}\n\ninterface LowConfidenceTag {\n Name: string;\n AvgWeight: number;\n UsageCount: number;\n TopEntity: string;\n SuggestedAction: string;\n ActionClass: string;\n}\n\ninterface ModelComparison {\n Name: string;\n Icon: string;\n IconColor: string;\n ScorePercentage: number;\n ScoreColor: string;\n AvgConfidence: number;\n TagsGenerated: number;\n Role: string;\n RoleColor: string;\n StrokeDash: string;\n}\n\ninterface CoOccurrencePairRow {\n TagAName: string;\n TagBName: string;\n Count: number;\n /** Bar width as percentage of the max count in the displayed list */\n BarWidth: number;\n}\n\ninterface DrillDownRecord {\n [key: string]: string | number | null;\n}\n\n// ================================================================\n// Component\n// ================================================================\n\n@RegisterClass(BaseResourceComponent, 'AnalyticsResource')\n@Component({\n standalone: false,\n selector: 'app-analytics-resource',\n templateUrl: './analytics-resource.component.html',\n styleUrls: ['./analytics-resource.component.css']\n})\nexport class AnalyticsResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n protected override navigationService = inject(NavigationService);\n protected override destroy$ = new Subject<void>();\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Analytics';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n\n // ================================================================\n // Navigation\n // ================================================================\n\n public NavItems: NavItem[] = [\n { ID: 'overview', Label: 'Overview', Icon: 'fa-solid fa-grip' },\n { ID: 'tags', Label: 'Tags', Icon: 'fa-solid fa-tags' },\n { ID: 'sources', Label: 'Sources', Icon: 'fa-solid fa-database' },\n { ID: 'pipeline', Label: 'Pipeline', Icon: 'fa-solid fa-gears' },\n { ID: 'quality', Label: 'Quality', Icon: 'fa-solid fa-circle-check' },\n { ID: 'cost', Label: 'Cost & Usage', Icon: 'fa-solid fa-coins' },\n ];\n\n public ActiveTab = 'overview';\n public IsLoading = true;\n\n // ================================================================\n // Filter State\n // ================================================================\n\n public DateRanges: DateRangeOption[] = [\n { Label: '7D', Days: 7 },\n { Label: '30D', Days: 30 },\n { Label: '90D', Days: 90 },\n { Label: 'YTD', Days: -1 },\n { Label: 'All', Days: 0 },\n ];\n\n public ActiveDateRange = '30D';\n public EntityFilter = 'All Entities';\n public EntityFilterOptions: string[] = ['All Entities'];\n\n // ================================================================\n // Drill-Down\n // ================================================================\n\n public DrillDownTarget: string | null = null;\n public DrillDownData: DrillDownRecord[] = [];\n public DrillDownColumns: string[] = [];\n public IsDrillDownLoading = false;\n /** Whether the current drill-down rows have navigable records */\n public DrillDownHasActions = false;\n\n /** AN-1: Open a record from a drill-down table row */\n public OpenDrillDownRecord(row: DrillDownRecord): void {\n const entityName = row['_EntityName'] as string | null;\n const recordID = row['_RecordID'] as string | null;\n if (!entityName || !recordID) return;\n\n // D9: If this is a Tag record, navigate to Classify Tag Library instead\n if (entityName === 'MJ: Tags') {\n const tagName = row['Name'] as string ?? row['Tag Name'] as string ?? '';\n this.navigateToClassifyTagLibrary(tagName);\n return;\n }\n\n const md = new Metadata();\n const entityInfo = md.Entities.find(e => e.Name === entityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, recordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: recordID }];\n }\n this.navigationService.OpenEntityRecord(entityName, pkey);\n }\n\n /**\n * D9: Navigate to the Classify dashboard's Tag Library tab with a tag pre-selected.\n * Uses NavigationService.OpenNavItemByName to switch to the Classify nav item\n * and passes the tag name and target tab via configuration.\n */\n private navigateToClassifyTagLibrary(tagName: string): void {\n this.navigationService.OpenNavItemByName('Classify', {\n initialTab: 'tags',\n tagSearch: tagName,\n });\n }\n\n // ================================================================\n // Overview Tab Data\n // ================================================================\n\n public KPIs: KPIData[] = [];\n\n public WidgetCards: WidgetCard[] = [\n { Key: 'tagGrowth', Title: 'Tag Growth', Icon: 'fa-solid fa-chart-line' },\n { Key: 'contentCoverage', Title: 'Content Coverage', Icon: 'fa-solid fa-bullseye' },\n { Key: 'qualityScore', Title: 'Quality Score', Icon: 'fa-solid fa-gauge-high' },\n { Key: 'sourcePerformance', Title: 'Source Performance', Icon: 'fa-solid fa-ranking-star' },\n { Key: 'dailyThroughput', Title: 'Daily Throughput', Icon: 'fa-solid fa-bolt' },\n { Key: 'taxonomyHealth', Title: 'Taxonomy Health', Icon: 'fa-solid fa-sitemap' },\n ];\n\n public TagGrowthData: TagGrowthMonth[] = [];\n public CoverageData: CoverageEntity[] = [];\n public QualityScore = 0;\n public MiniConfidenceBins: { Height: number; Color: string; Title: string }[] = [];\n public SourcePerfData: SourcePerformanceRow[] = [];\n public ThroughputData: ThroughputDay[] = [];\n public TaxonomyTotal = 0;\n public TaxonomyStats: TaxonomyStat[] = [];\n public TaxonomyRingSegments: { StrokeDash: string; StrokeOffset: string; Color: string }[] = [];\n\n // ================================================================\n // Tags Tab Data\n // ================================================================\n\n public TopTags: TopTagRow[] = [];\n public EntityDistribution: EntityDistributionRow[] = [];\n public DistributionLegend: { Label: string; Color: string }[] = [\n { Label: 'Primary', Color: 'var(--mj-brand-primary)' },\n { Label: 'Secondary', Color: 'var(--mj-status-info)' },\n { Label: 'Tertiary', Color: '#7c3aed' },\n { Label: 'Quaternary', Color: 'var(--mj-status-success)' },\n { Label: 'Other', Color: 'var(--mj-status-warning)' },\n ];\n public TagDepthBars: TagDepthBar[] = [];\n\n // --- Co-occurrence data ---\n public CoOccurrencePairs: CoOccurrencePairRow[] = [];\n public CoOccurrenceLastComputed: string | null = null;\n public IsRecomputingCoOccurrence = false;\n\n // ================================================================\n // Sources Tab Data\n // ================================================================\n\n public SourceComparison: SourceComparisonRow[] = [];\n public SelectedSourceName = '';\n public SourceWeeklyBars: { Label: string; Value: number; Percentage: number }[] = [];\n public SourceQualityBands: { Label: string; Percentage: number; Color: string }[] = [];\n public SourceQualityNote = '';\n public SourceHealthCards: SourceHealthCard[] = [];\n\n // ================================================================\n // Pipeline Tab Data\n // ================================================================\n\n public PipelineThroughputBars: PipelineBar[] = [];\n public PipelineDateLabels: string[] = [];\n public ProcessingStages: ProcessingStage[] = [];\n public TotalAvgProcessingTime = 0;\n public BottleneckStage = '';\n public BottleneckPercent = 0;\n public SuccessRateAvg = 0;\n public FailureRateAvg = 0;\n public ActiveRuns: ActiveRunRow[] = [];\n public ErrorLog: ErrorLogEntry[] = [];\n\n // ================================================================\n // Quality Tab Data\n // ================================================================\n\n public ConfidenceHistogram: HistogramBin[] = [];\n public ConfidenceStats: { Label: string; Value: string }[] = [];\n public WeightByEntity: WeightGroupedEntity[] = [];\n public WeightLegend: { Label: string; Color: string }[] = [\n { Label: 'High (>0.7)', Color: 'var(--mj-brand-primary)' },\n { Label: 'Medium (0.4-0.7)', Color: 'var(--mj-status-info)' },\n { Label: 'Low (<0.4)', Color: 'var(--mj-text-muted)' },\n ];\n public AccuracyLinePoints = '';\n public AccuracyDots: { Cx: number; Cy: number }[] = [];\n public AccuracyMonthLabels: string[] = [];\n public AccuracyTrendText = '';\n public LowConfidenceTags: LowConfidenceTag[] = [];\n public ModelComparisons: ModelComparison[] = [];\n public ModelRecommendation = '';\n\n // ================================================================\n // Trending Tags (sidebar)\n // ================================================================\n\n public TrendingTags: { Name: string; Size: number; Weight: number }[] = [];\n public PipelineStatusText = 'Loading...';\n public PipelineStatusOk = true;\n\n // ================================================================\n // Cost & Usage Tab Data (D1)\n // ================================================================\n\n public CostKPIs: { Label: string; Value: string; Icon: string; SubLabel: string }[] = [];\n public CostPerRunRows: { RunID: string; Source: string; Tokens: number; Cost: number; Started: string }[] = [];\n\n // ================================================================\n // Raw data for aggregation\n // ================================================================\n\n private rawTags: Record<string, unknown>[] = [];\n private rawContentItemTags: Record<string, unknown>[] = [];\n private rawContentItems: Record<string, unknown>[] = [];\n public rawProcessRuns: Record<string, unknown>[] = [];\n private rawContentSources: Record<string, unknown>[] = [];\n private rawContentTypes: Record<string, unknown>[] = [];\n private rawRunDetails: Record<string, unknown>[] = [];\n\n // ================================================================\n // Lifecycle\n // ================================================================\n\n async ngAfterViewInit(): Promise<void> {\n await UserInfoEngine.Instance.Config(false);\n this.loadAnalyticsPreferences();\n this.loadAllData();\n this.emitAgentContext();\n this.registerAgentTools();\n this.NotifyLoadComplete();\n }\n\n private emitAgentContext(): void {\n this.navigationService.SetAgentContext(this, {\n ActiveTab: this.ActiveTab,\n DateRange: this.ActiveDateRange,\n EntityFilter: this.EntityFilter,\n KPIs: this.KPIs.map(k => ({ Label: k.Label, Value: k.Value })),\n });\n }\n\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SwitchAnalyticsTab',\n Description: 'Switch to a specific analytics tab (overview, tags, sources, pipeline, quality)',\n ParameterSchema: { type: 'object', properties: { tab: { type: 'string' } }, required: ['tab'] },\n Handler: async (params: Record<string, unknown>) => {\n this.SelectTab(params['tab'] as string);\n return { Success: true };\n },\n },\n {\n Name: 'SetAnalyticsDateRange',\n Description: 'Set the analytics date range filter (7D, 30D, 90D, YTD, All)',\n ParameterSchema: { type: 'object', properties: { range: { type: 'string' } }, required: ['range'] },\n Handler: async (params: Record<string, unknown>) => {\n this.SetDateRange(params['range'] as string);\n return { Success: true };\n },\n },\n {\n Name: 'ExportAnalyticsCSV',\n Description: 'Export analytics data as CSV',\n ParameterSchema: { type: 'object', properties: { dataKey: { type: 'string' } }, required: ['dataKey'] },\n Handler: async (params: Record<string, unknown>) => {\n this.ExportTabDataCSV(params['dataKey'] as string);\n return { Success: true };\n },\n },\n ]);\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // Public Methods\n // ================================================================\n\n public SelectTab(tabId: string): void {\n this.ActiveTab = tabId;\n this.CloseDrillDown();\n this.persistAnalyticsPreferences();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n public SetDateRange(label: string): void {\n this.ActiveDateRange = label;\n this.CloseDrillDown();\n this.rebuildAllAggregations();\n this.persistAnalyticsPreferences();\n this.cdr.detectChanges();\n }\n\n public SetEntityFilter(value: string): void {\n this.EntityFilter = value;\n this.CloseDrillDown();\n this.rebuildAllAggregations();\n this.persistAnalyticsPreferences();\n this.cdr.detectChanges();\n }\n\n public OpenDrillDown(key: string): void {\n if (this.DrillDownTarget === key) {\n this.CloseDrillDown();\n return;\n }\n this.DrillDownTarget = key;\n this.IsDrillDownLoading = true;\n this.cdr.detectChanges();\n this.loadDrillDownData(key);\n }\n\n public CloseDrillDown(): void {\n this.DrillDownTarget = null;\n this.DrillDownData = [];\n this.DrillDownColumns = [];\n this.IsDrillDownLoading = false;\n this.DrillDownHasActions = false;\n this.cdr.detectChanges();\n }\n\n // ================================================================\n // AN-3: Export (CSV)\n // ================================================================\n\n /** Export drill-down data as CSV */\n public ExportDrillDownCSV(): void {\n if (this.DrillDownData.length === 0 || this.DrillDownColumns.length === 0) return;\n const filename = `analytics-${this.DrillDownTarget || 'data'}-${new Date().toISOString().slice(0, 10)}.csv`;\n this.downloadCSV(this.DrillDownColumns, this.DrillDownData, filename);\n }\n\n /** Export a named data set (top-tags, sources, etc.) as CSV */\n public ExportTabDataCSV(dataKey: string): void {\n switch (dataKey) {\n case 'top-tags': {\n const cols = ['Rank', 'Name', 'Usage Count', 'Avg Weight', 'Top Entity', 'First Seen'];\n const rows = this.TopTags.map(t => ({\n 'Rank': t.Rank, 'Name': t.Name, 'Usage Count': t.UsageCount,\n 'Avg Weight': t.AvgWeight, 'Top Entity': t.TopEntity, 'First Seen': t.FirstSeen,\n }));\n this.downloadCSV(cols, rows, `top-tags-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n case 'kpis': {\n const cols = ['Metric', 'Value', 'Change'];\n const rows = this.KPIs.map(k => ({\n 'Metric': k.Label, 'Value': k.Value, 'Change': k.Delta,\n }));\n this.downloadCSV(cols, rows, `kpis-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n case 'cost-usage': {\n const costCols = ['Run ID', 'Source', 'Tokens', 'Cost', 'Started'];\n const costRows = this.CostPerRunRows.map(r => ({\n 'Run ID': r.RunID, 'Source': r.Source, 'Tokens': r.Tokens,\n 'Cost': r.Cost, 'Started': r.Started,\n }));\n this.downloadCSV(costCols, costRows, `cost-usage-${new Date().toISOString().slice(0, 10)}.csv`);\n break;\n }\n default:\n break;\n }\n }\n\n private downloadCSV(columns: string[], data: Record<string, string | number | null>[], filename: string): void {\n const escape = (v: string | number | null): string => {\n const s = String(v ?? '');\n return s.includes(',') || s.includes('\"') || s.includes('\\n')\n ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const header = columns.map(escape).join(',');\n const rows = data.map(row => columns.map(c => escape(row[c])).join(','));\n const csv = [header, ...rows].join('\\n');\n\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n public SelectSource(name: string): void {\n this.SelectedSourceName = name;\n this.buildSourceDetail();\n this.cdr.detectChanges();\n }\n\n public FormatNumber(n: number): string {\n if (n >= 1000) {\n return n.toLocaleString();\n }\n return String(n);\n }\n\n public TrackByIndex(index: number): number {\n return index;\n }\n\n public TrackByID(_index: number, item: { ID?: string; Key?: string; Label?: string; Name?: string }): string {\n return item.ID || item.Key || item.Label || item.Name || String(_index);\n }\n\n // ================================================================\n // Data Loading\n // ================================================================\n\n private async loadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const results = await rv.RunViews([\n { EntityName: 'MJ: Tags', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Item Tags', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Items', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Process Runs', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Sources', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Types', ExtraFilter: '', ResultType: 'simple' },\n { EntityName: 'MJ: Content Process Run Details', ExtraFilter: '', ResultType: 'simple' },\n ]);\n\n this.rawTags = results[0]?.Success ? results[0].Results : [];\n this.rawContentItemTags = results[1]?.Success ? results[1].Results : [];\n this.rawContentItems = results[2]?.Success ? results[2].Results : [];\n this.rawProcessRuns = results[3]?.Success ? results[3].Results : [];\n this.rawContentSources = results[4]?.Success ? results[4].Results : [];\n this.rawContentTypes = results[5]?.Success ? results[5].Results : [];\n this.rawRunDetails = results[6]?.Success ? results[6].Results : [];\n\n this.buildEntityFilterOptions();\n this.rebuildAllAggregations();\n\n } catch (error) {\n console.error('[Analytics] Error loading data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ================================================================\n // Entity Filter Options\n // ================================================================\n\n private buildEntityFilterOptions(): void {\n const md = new Metadata();\n const entityNames = new Set<string>();\n for (const item of this.rawContentItems) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n if (ct) {\n entityNames.add(String(ct['Name'] || 'Unknown'));\n }\n }\n this.EntityFilterOptions = ['All Entities', ...Array.from(entityNames).sort()];\n }\n\n // ================================================================\n // Aggregation Orchestrator\n // ================================================================\n\n private rebuildAllAggregations(): void {\n const filteredItems = this.getDateFilteredItems(this.rawContentItems);\n const filteredTags = this.getDateFilteredItems(this.rawContentItemTags);\n const filteredRuns = this.getDateFilteredItems(this.rawProcessRuns);\n\n this.buildKPIs(filteredTags, filteredItems);\n this.buildTagGrowth();\n this.buildCoverageData(filteredItems, filteredTags);\n this.buildQualityScore(filteredTags);\n this.buildSourcePerformance(filteredItems, filteredTags);\n this.buildThroughput(filteredRuns);\n this.buildTaxonomyHealth();\n this.buildTopTags(filteredTags);\n this.buildEntityDistribution(filteredTags);\n this.buildTagDepth();\n this.buildSourceComparison(filteredItems, filteredTags, filteredRuns);\n this.buildSourceHealth(filteredRuns);\n this.buildPipelineThroughput(filteredRuns);\n this.buildProcessingStages(filteredRuns);\n this.buildActiveRuns();\n this.buildErrorLog(filteredRuns);\n this.buildConfidenceHistogram(filteredTags);\n this.buildWeightByEntity(filteredTags);\n this.buildAccuracyTrend(filteredTags);\n this.buildLowConfidenceTags(filteredTags);\n this.buildModelComparisons();\n this.buildTrendingTags(filteredTags);\n this.buildPipelineStatus(filteredRuns);\n this.buildCostUsageData(filteredRuns);\n\n if (this.rawContentSources.length > 0) {\n this.SelectedSourceName = String(this.rawContentSources[0]['Name'] || '');\n this.buildSourceDetail();\n }\n\n // Load co-occurrence data in background (non-blocking)\n this.loadCoOccurrenceData();\n }\n\n // ================================================================\n // Date Filtering\n // ================================================================\n\n private getDateFilteredItems(items: Record<string, unknown>[]): Record<string, unknown>[] {\n const range = this.DateRanges.find(d => d.Label === this.ActiveDateRange);\n if (!range || range.Days === 0) return items; // \"All\"\n\n const now = new Date();\n let cutoff: Date;\n if (range.Days === -1) {\n // YTD\n cutoff = new Date(now.getFullYear(), 0, 1);\n } else {\n cutoff = new Date(now.getTime() - range.Days * 86400000);\n }\n\n return items.filter(item => {\n const d = item['__mj_CreatedAt'] || item['StartTime'];\n if (!d) return true;\n const dt = new Date(String(d));\n return dt >= cutoff;\n });\n }\n\n // ================================================================\n // KPIs\n // ================================================================\n\n private buildKPIs(tags: Record<string, unknown>[], items: Record<string, unknown>[]): void {\n const totalTags = this.rawTags.length;\n const itemsProcessed = items.length;\n\n const weights = tags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avgConfidence = weights.length > 0\n ? weights.reduce((a, b) => a + b, 0) / weights.length\n : 0;\n\n const totalContentItems = this.rawContentItems.length;\n const taggedItemIds = new Set(tags.map(t => String(t['ItemID'] || '')));\n const coveragePct = totalContentItems > 0\n ? Math.round((taggedItemIds.size / totalContentItems) * 100)\n : 0;\n\n // Calculate weekly delta for tags\n const weekAgo = new Date(Date.now() - 7 * 86400000);\n const recentTags = this.rawTags.filter(t => {\n const d = t['__mj_CreatedAt'];\n return d && new Date(String(d)) >= weekAgo;\n });\n\n this.KPIs = [\n {\n Label: 'Total Tags',\n Value: this.FormatNumber(totalTags),\n Delta: `+${recentTags.length} this week`,\n DeltaDirection: recentTags.length > 0 ? 'up' : 'flat',\n SparklinePoints: '2,24 10,22 18,20 26,18 34,14 42,12 50,8 62,4',\n SparklineColor: 'var(--mj-brand-primary)',\n SparklineGradId: 'sparkGrad1',\n DrillDownKey: 'kpi-totalTags',\n },\n {\n Label: 'Items Processed',\n Value: this.FormatNumber(itemsProcessed),\n Delta: `${this.FormatNumber(itemsProcessed)} total`,\n DeltaDirection: 'up',\n SparklinePoints: '2,18 8,12 14,16 20,10 26,14 32,8 38,12 44,6 50,10 56,4 62,8',\n SparklineColor: 'var(--mj-status-success)',\n SparklineGradId: 'sparkGrad2',\n DrillDownKey: 'kpi-itemsProcessed',\n },\n {\n Label: 'Avg Confidence',\n Value: avgConfidence.toFixed(2),\n Delta: avgConfidence >= 0.7 ? 'Good' : 'Needs improvement',\n DeltaDirection: avgConfidence >= 0.7 ? 'up' : 'down',\n SparklinePoints: '2,20 10,18 18,16 26,18 34,14 42,12 50,14 62,10',\n SparklineColor: 'var(--mj-status-warning)',\n SparklineGradId: 'sparkGrad3',\n DrillDownKey: 'kpi-avgConfidence',\n },\n {\n Label: 'Coverage',\n Value: `${coveragePct}%`,\n Delta: `${taggedItemIds.size} of ${totalContentItems} items`,\n DeltaDirection: coveragePct >= 50 ? 'up' : 'down',\n SparklinePoints: '2,24 10,22 18,20 26,18 34,16 42,14 50,12 62,10',\n SparklineColor: '#7c3aed',\n SparklineGradId: 'sparkGrad4',\n DrillDownKey: 'kpi-coverage',\n },\n ];\n }\n\n // ================================================================\n // Tag Growth (monthly bar chart)\n // ================================================================\n\n private buildTagGrowth(): void {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const now = new Date();\n const months: TagGrowthMonth[] = [];\n let cumulative = 0;\n\n // Count tags by month for last 6 months\n for (let i = 5; i >= 0; i--) {\n const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);\n const nextMonth = new Date(now.getFullYear(), now.getMonth() - i + 1, 1);\n const count = this.rawTags.filter(t => {\n const d = t['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= monthDate && dt < nextMonth;\n }).length;\n cumulative += count;\n months.push({\n Label: monthNames[monthDate.getMonth()],\n Count: cumulative,\n Percentage: 0,\n });\n }\n\n // If no data, show the total in the last month\n if (cumulative === 0 && this.rawTags.length > 0) {\n months[months.length - 1].Count = this.rawTags.length;\n cumulative = this.rawTags.length;\n }\n\n const max = Math.max(...months.map(m => m.Count), 1);\n months.forEach(m => m.Percentage = Math.round((m.Count / max) * 100));\n this.TagGrowthData = months;\n }\n\n // ================================================================\n // Content Coverage (progress rings per entity type)\n // ================================================================\n\n private buildCoverageData(items: Record<string, unknown>[], tags: Record<string, unknown>[]): void {\n const colors = ['var(--mj-status-warning)', 'var(--mj-status-success)', 'var(--mj-status-info)', 'var(--mj-brand-primary)'];\n const typeMap = new Map<string, { name: string; total: number; tagged: Set<string> }>();\n\n for (const item of this.rawContentItems) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n if (!typeMap.has(typeName)) {\n typeMap.set(typeName, { name: typeName, total: 0, tagged: new Set() });\n }\n typeMap.get(typeName)!.total++;\n }\n\n const taggedItemIdsByType = new Map<string, Set<string>>();\n for (const tag of tags) {\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n if (typeMap.has(typeName)) {\n typeMap.get(typeName)!.tagged.add(itemId);\n }\n }\n }\n\n const circumference = 2 * Math.PI * 20; // r=20\n let idx = 0;\n this.CoverageData = Array.from(typeMap.values())\n .sort((a, b) => b.total - a.total)\n .slice(0, 4)\n .map(entry => {\n const pct = entry.total > 0 ? Math.round((entry.tagged.size / entry.total) * 100) : 0;\n const dashLength = (pct / 100) * circumference;\n const color = colors[idx % colors.length];\n idx++;\n return {\n Name: entry.name,\n Tagged: entry.tagged.size,\n Total: entry.total,\n Percentage: pct,\n Color: color,\n StrokeDash: `${dashLength.toFixed(1)} ${circumference.toFixed(1)}`,\n };\n });\n }\n\n // ================================================================\n // Quality Score (gauge)\n // ================================================================\n\n private buildQualityScore(tags: Record<string, unknown>[]): void {\n const weights = tags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n this.QualityScore = weights.length > 0\n ? Math.round((weights.reduce((a, b) => a + b, 0) / weights.length) * 100)\n : 0;\n\n // Mini confidence bins\n const bins = [0, 0, 0, 0, 0]; // 0-0.2, 0.2-0.4, 0.4-0.6, 0.6-0.8, 0.8-1.0\n for (const w of weights) {\n const idx = Math.min(Math.floor(w * 5), 4);\n bins[idx]++;\n }\n const maxBin = Math.max(...bins, 1);\n const binColors = [\n 'var(--mj-border-default)', 'var(--mj-border-default)',\n 'var(--mj-status-warning)', 'var(--mj-brand-primary)', 'var(--mj-brand-primary)',\n ];\n this.MiniConfidenceBins = bins.map((count, i) => ({\n Height: Math.max(4, Math.round((count / maxBin) * 32)),\n Color: binColors[i],\n Title: `${(i * 0.2).toFixed(1)}-${((i + 1) * 0.2).toFixed(1)}: ${count}`,\n }));\n }\n\n // ================================================================\n // Source Performance (horizontal bars)\n // ================================================================\n\n private buildSourcePerformance(items: Record<string, unknown>[], tags: Record<string, unknown>[]): void {\n const sourceTagCounts = new Map<string, { name: string; items: Set<string>; tagCount: number }>();\n\n for (const source of this.rawContentSources) {\n const sid = String(source['ID']);\n sourceTagCounts.set(sid, {\n name: String(source['Name'] || 'Unknown'),\n items: new Set(),\n tagCount: 0,\n });\n }\n\n for (const item of this.rawContentItems) {\n const sid = String(item['ContentSourceID'] || '');\n const entry = sourceTagCounts.get(sid);\n if (entry) {\n entry.items.add(String(item['ID']));\n }\n }\n\n for (const tag of tags) {\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const sid = String(item['ContentSourceID'] || '');\n const entry = sourceTagCounts.get(sid);\n if (entry) {\n entry.tagCount++;\n }\n }\n }\n\n const colors = ['var(--mj-brand-primary)', '#7c3aed', 'var(--mj-status-info)', 'var(--mj-status-success)'];\n const sorted = Array.from(sourceTagCounts.values())\n .map(e => ({\n name: e.name,\n avg: e.items.size > 0 ? e.tagCount / e.items.size : 0,\n }))\n .sort((a, b) => b.avg - a.avg)\n .slice(0, 4);\n\n const maxAvg = Math.max(...sorted.map(s => s.avg), 1);\n this.SourcePerfData = sorted.map((s, i) => ({\n Name: s.name,\n AvgTagsPerItem: Math.round(s.avg * 10) / 10,\n Percentage: Math.round((s.avg / maxAvg) * 100),\n Color: colors[i % colors.length],\n }));\n }\n\n // ================================================================\n // Daily Throughput (14-day bar chart)\n // ================================================================\n\n private buildThroughput(runs: Record<string, unknown>[]): void {\n const days: ThroughputDay[] = [];\n const now = new Date();\n\n for (let i = 13; i >= 0; i--) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i);\n const dayStr = d.toISOString().slice(0, 10);\n const dayRuns = runs.filter(r => {\n const st = r['StartTime'];\n if (!st) return false;\n return String(st).slice(0, 10) === dayStr;\n });\n const totalItems = dayRuns.reduce((sum, r) => sum + Number(r['ProcessedItems'] || 0), 0);\n const hasError = dayRuns.some(r => String(r['Status'] || '').toLowerCase().includes('error') || String(r['Status'] || '').toLowerCase().includes('fail'));\n\n days.push({\n Label: String(d.getDate()),\n Percentage: totalItems,\n IsError: hasError,\n });\n }\n\n const maxItems = Math.max(...days.map(d => d.Percentage), 1);\n days.forEach(d => d.Percentage = Math.max(5, Math.round((d.Percentage / maxItems) * 100)));\n this.ThroughputData = days;\n }\n\n // ================================================================\n // Taxonomy Health (donut + stat cards)\n // ================================================================\n\n private buildTaxonomyHealth(): void {\n const total = this.rawTags.length;\n this.TaxonomyTotal = total;\n\n if (total === 0) {\n this.TaxonomyStats = [\n { Label: 'Healthy', Count: 0, Color: 'var(--mj-status-success)', BgColor: 'color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface))' },\n { Label: 'Attention', Count: 0, Color: 'var(--mj-status-warning)', BgColor: 'color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface))' },\n { Label: 'Orphaned', Count: 0, Color: 'var(--mj-status-error)', BgColor: 'color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface))' },\n ];\n this.TaxonomyRingSegments = [];\n return;\n }\n\n // Tags with children = healthy, tags referenced by content items = healthy\n // Tags with no children and no usage = orphaned\n // Tags with low usage = attention\n const tagIds = new Set(this.rawTags.map(t => String(t['ID'])));\n const parentIds = new Set(this.rawTags.filter(t => t['ParentID']).map(t => String(t['ParentID'])));\n const usedTagIds = new Set(this.rawContentItemTags.filter(ct => ct['TagID']).map(ct => String(ct['TagID'])));\n\n let healthy = 0;\n let attention = 0;\n let orphaned = 0;\n\n for (const tag of this.rawTags) {\n const tid = String(tag['ID']);\n const hasChildren = parentIds.has(tid);\n const isUsed = usedTagIds.has(tid);\n if (hasChildren || isUsed) {\n healthy++;\n } else if (tag['ParentID']) {\n attention++;\n } else {\n orphaned++;\n }\n }\n\n this.TaxonomyStats = [\n { Label: 'Healthy', Count: healthy, Color: 'var(--mj-status-success)', BgColor: 'color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface))' },\n { Label: 'Attention', Count: attention, Color: 'var(--mj-status-warning)', BgColor: 'color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface))' },\n { Label: 'Orphaned', Count: orphaned, Color: 'var(--mj-status-error)', BgColor: 'color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface))' },\n ];\n\n // Ring segments\n const circumference = 2 * Math.PI * 54; // r=54\n const healthyPct = healthy / total;\n const attentionPct = attention / total;\n const orphanedPct = orphaned / total;\n\n const segments: { StrokeDash: string; StrokeOffset: string; Color: string }[] = [];\n let offset = circumference * 0.25; // start at top\n\n if (healthyPct > 0) {\n const len = healthyPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-success)',\n });\n offset += len;\n }\n if (attentionPct > 0) {\n const len = attentionPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-warning)',\n });\n offset += len;\n }\n if (orphanedPct > 0) {\n const len = orphanedPct * circumference;\n segments.push({\n StrokeDash: `${len.toFixed(1)} ${circumference.toFixed(1)}`,\n StrokeOffset: (-offset).toFixed(1),\n Color: 'var(--mj-status-error)',\n });\n }\n\n this.TaxonomyRingSegments = segments;\n }\n\n // ================================================================\n // Top Tags Table\n // ================================================================\n\n private buildTopTags(tags: Record<string, unknown>[]): void {\n const tagUsage = new Map<string, { name: string; count: number; totalWeight: number; entities: Map<string, number>; firstSeen: Date }>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n if (!tagText) continue;\n\n if (!tagUsage.has(tagText)) {\n const created = tag['__mj_CreatedAt'] ? new Date(String(tag['__mj_CreatedAt'])) : new Date();\n tagUsage.set(tagText, { name: tagText, count: 0, totalWeight: 0, entities: new Map(), firstSeen: created });\n }\n const entry = tagUsage.get(tagText)!;\n entry.count++;\n entry.totalWeight += Number(tag['Weight'] || 0);\n\n // Find entity for this tag\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n entry.entities.set(typeName, (entry.entities.get(typeName) || 0) + 1);\n }\n\n const created = tag['__mj_CreatedAt'] ? new Date(String(tag['__mj_CreatedAt'])) : new Date();\n if (created < entry.firstSeen) entry.firstSeen = created;\n }\n\n const sorted = Array.from(tagUsage.values()).sort((a, b) => b.count - a.count).slice(0, 20);\n const maxCount = sorted.length > 0 ? sorted[0].count : 1;\n\n this.TopTags = sorted.map((entry, idx) => {\n const avgWeight = entry.count > 0 ? entry.totalWeight / entry.count : 0;\n const topEntity = entry.entities.size > 0\n ? Array.from(entry.entities.entries()).sort((a, b) => b[1] - a[1])[0][0]\n : 'N/A';\n\n let weightColor = 'var(--mj-brand-primary)';\n if (avgWeight >= 0.8) weightColor = 'var(--mj-status-success)';\n else if (avgWeight < 0.5) weightColor = 'var(--mj-status-warning)';\n else if (avgWeight < 0.4) weightColor = 'var(--mj-status-error)';\n\n // Generate simple trend sparkline points\n const trendPoints = this.generateTrendPoints(avgWeight);\n const trendColor = avgWeight >= 0.6 ? 'var(--mj-status-success)' : 'var(--mj-brand-primary)';\n\n return {\n Rank: idx + 1,\n Name: entry.name,\n UsageCount: entry.count,\n AvgWeight: Math.round(avgWeight * 100) / 100,\n WeightBarWidth: Math.round(avgWeight * 80),\n WeightBarColor: weightColor,\n TrendPoints: trendPoints,\n TrendColor: trendColor,\n TopEntity: topEntity,\n FirstSeen: entry.firstSeen.toISOString().slice(0, 10),\n };\n });\n }\n\n private generateTrendPoints(weight: number): string {\n // Generate a gentle trend line based on weight\n const baseY = 14 - weight * 8;\n const variance = 3;\n const points: string[] = [];\n for (let x = 2; x <= 46; x += 8) {\n const y = Math.max(2, Math.min(14, baseY + (Math.random() - 0.5) * variance));\n points.push(`${x},${y.toFixed(0)}`);\n }\n return points.join(' ');\n }\n\n // ================================================================\n // Entity Distribution (stacked bars)\n // ================================================================\n\n private buildEntityDistribution(tags: Record<string, unknown>[]): void {\n const entityTagDist = new Map<string, Map<string, number>>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (!item || !tagText) continue;\n\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n\n if (!entityTagDist.has(typeName)) entityTagDist.set(typeName, new Map());\n const tagMap = entityTagDist.get(typeName)!;\n tagMap.set(tagText, (tagMap.get(tagText) || 0) + 1);\n }\n\n const segmentColors = ['var(--mj-brand-primary)', 'var(--mj-status-info)', '#7c3aed', 'var(--mj-status-success)', 'var(--mj-status-warning)'];\n\n this.EntityDistribution = Array.from(entityTagDist.entries())\n .sort((a, b) => {\n const totalA = Array.from(a[1].values()).reduce((s, v) => s + v, 0);\n const totalB = Array.from(b[1].values()).reduce((s, v) => s + v, 0);\n return totalB - totalA;\n })\n .slice(0, 4)\n .map(([entityName, tagMap]) => {\n const total = Array.from(tagMap.values()).reduce((s, v) => s + v, 0);\n const topTags = Array.from(tagMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4);\n\n const segments: EntityDistSegment[] = [];\n let accumulatedPct = 0;\n\n topTags.forEach(([name, count], i) => {\n const pct = Math.round((count / total) * 100);\n accumulatedPct += pct;\n segments.push({\n Label: name.length > 6 ? name.slice(0, 5) + '.' : name,\n Percentage: pct,\n Color: segmentColors[i % segmentColors.length],\n });\n });\n\n if (accumulatedPct < 100) {\n segments.push({\n Label: '...',\n Percentage: 100 - accumulatedPct,\n Color: segmentColors[4],\n });\n }\n\n return { EntityName: entityName, Segments: segments };\n });\n }\n\n // ================================================================\n // Tag Depth Distribution\n // ================================================================\n\n private buildTagDepth(): void {\n const parentMap = new Map<string, string | null>();\n for (const tag of this.rawTags) {\n parentMap.set(String(tag['ID']), tag['ParentID'] ? String(tag['ParentID']) : null);\n }\n\n const depthCounts = new Map<number, number>();\n for (const tag of this.rawTags) {\n let depth = 1;\n let current = tag['ParentID'] ? String(tag['ParentID']) : null;\n while (current && depth < 10) {\n depth++;\n current = parentMap.get(current) || null;\n }\n depthCounts.set(depth, (depthCounts.get(depth) || 0) + 1);\n }\n\n const maxDepth = Math.max(...Array.from(depthCounts.keys()), 1);\n const maxCount = Math.max(...Array.from(depthCounts.values()), 1);\n const bars: TagDepthBar[] = [];\n\n for (let d = 1; d <= Math.max(maxDepth, 5); d++) {\n const count = depthCounts.get(d) || 0;\n bars.push({\n Label: `Depth ${d}`,\n Count: count,\n Percentage: Math.max(count > 0 ? 7 : 0, Math.round((count / maxCount) * 100)),\n });\n }\n\n this.TagDepthBars = bars;\n }\n\n // ================================================================\n // Source Comparison Table\n // ================================================================\n\n private buildSourceComparison(\n items: Record<string, unknown>[],\n tags: Record<string, unknown>[],\n runs: Record<string, unknown>[]\n ): void {\n this.SourceComparison = this.rawContentSources.map(source => {\n const sid = String(source['ID']);\n const sourceItems = items.filter(i => String(i['ContentSourceID']) === sid);\n const sourceItemIds = new Set(sourceItems.map(i => String(i['ID'])));\n const sourceTags = tags.filter(t => sourceItemIds.has(String(t['ItemID'] || '')));\n const avgTags = sourceItems.length > 0 ? sourceTags.length / sourceItems.length : 0;\n const weights = sourceTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avgWeight = weights.length > 0 ? weights.reduce((a, b) => a + b, 0) / weights.length : 0;\n\n const sourceRuns = runs.filter(r => String(r['SourceID']) === sid);\n const lastRun = sourceRuns.length > 0\n ? sourceRuns.sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())[0]\n : null;\n\n const hasError = lastRun && String(lastRun['Status'] || '').toLowerCase().includes('error');\n const isSlow = lastRun && !hasError && sourceRuns.length > 0;\n\n // Determine source type\n const ctid = String(source['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Source') : 'Source';\n\n return {\n Name: String(source['Name'] || 'Unknown'),\n Type: typeName,\n TypeIcon: this.getSourceTypeIcon(typeName),\n TypeColor: this.getSourceTypeColor(typeName),\n Items: sourceItems.length,\n TagsGenerated: sourceTags.length,\n AvgTagsPerItem: Math.round(avgTags * 10) / 10,\n AvgWeight: Math.round(avgWeight * 100) / 100,\n LastRun: lastRun ? this.formatRelativeTime(new Date(String(lastRun['StartTime']))) : 'Never',\n Status: hasError ? 'Error' : 'Active',\n StatusClass: hasError ? 'badge-error' : 'badge-success',\n };\n });\n }\n\n private getSourceTypeIcon(typeName: string): string {\n const lower = typeName.toLowerCase();\n if (lower.includes('rss')) return 'fa-solid fa-rss';\n if (lower.includes('entity') || lower.includes('crm') || lower.includes('contact')) return 'fa-solid fa-address-book';\n if (lower.includes('web') || lower.includes('site')) return 'fa-solid fa-globe';\n if (lower.includes('cloud') || lower.includes('drive') || lower.includes('storage')) return 'fa-solid fa-cloud';\n return 'fa-solid fa-database';\n }\n\n private getSourceTypeColor(typeName: string): string {\n const lower = typeName.toLowerCase();\n if (lower.includes('rss')) return 'var(--mj-status-warning)';\n if (lower.includes('entity') || lower.includes('crm')) return 'var(--mj-brand-primary)';\n if (lower.includes('web')) return '#7c3aed';\n if (lower.includes('cloud')) return 'var(--mj-status-info)';\n return 'var(--mj-text-muted)';\n }\n\n private formatRelativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins} min ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours} hours ago`;\n const days = Math.floor(hours / 24);\n return `${days} day${days > 1 ? 's' : ''} ago`;\n }\n\n // ================================================================\n // Source Detail (sidebar selection)\n // ================================================================\n\n private buildSourceDetail(): void {\n const source = this.rawContentSources.find(s => String(s['Name']) === this.SelectedSourceName);\n if (!source) return;\n\n const sid = String(source['ID']);\n const sourceItems = this.rawContentItems.filter(i => String(i['ContentSourceID']) === sid);\n const sourceItemIds = new Set(sourceItems.map(i => String(i['ID'])));\n const sourceTags = this.rawContentItemTags.filter(t => sourceItemIds.has(String(t['ItemID'] || '')));\n\n // Weekly bars (last 8 weeks)\n const now = new Date();\n const weekBars: { Label: string; Value: number; Percentage: number }[] = [];\n for (let w = 7; w >= 0; w--) {\n const weekStart = new Date(now.getTime() - (w + 1) * 7 * 86400000);\n const weekEnd = new Date(now.getTime() - w * 7 * 86400000);\n const count = sourceItems.filter(i => {\n const d = i['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= weekStart && dt < weekEnd;\n }).length;\n weekBars.push({ Label: `W${8 - w}`, Value: count, Percentage: 0 });\n }\n const maxWeek = Math.max(...weekBars.map(w => w.Value), 1);\n weekBars.forEach(w => w.Percentage = Math.round((w.Value / maxWeek) * 100));\n this.SourceWeeklyBars = weekBars;\n\n // Quality bands\n const weights = sourceTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const high = weights.filter(w => w > 0.8).length;\n const med = weights.filter(w => w >= 0.5 && w <= 0.8).length;\n const low = weights.filter(w => w < 0.5).length;\n const total = Math.max(weights.length, 1);\n\n this.SourceQualityBands = [\n { Label: 'High (>0.8)', Percentage: Math.round((high / total) * 100), Color: 'var(--mj-status-success)' },\n { Label: 'Med (0.5-0.8)', Percentage: Math.round((med / total) * 100), Color: 'var(--mj-status-warning)' },\n { Label: 'Low (<0.5)', Percentage: Math.round((low / total) * 100), Color: 'var(--mj-status-error)' },\n ];\n\n const highPct = Math.round((high / total) * 100);\n this.SourceQualityNote = `${this.SelectedSourceName} has ${highPct}% of tags scoring above 0.8 confidence.`;\n }\n\n // ================================================================\n // Source Health Cards\n // ================================================================\n\n private buildSourceHealth(runs: Record<string, unknown>[]): void {\n this.SourceHealthCards = this.rawContentSources.map(source => {\n const sid = String(source['ID']);\n const sourceRuns = runs.filter(r => String(r['SourceID']) === sid);\n const totalRuns = sourceRuns.length;\n const successRuns = sourceRuns.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return !status.includes('error') && !status.includes('fail');\n }).length;\n const uptime = totalRuns > 0 ? Math.round((successRuns / totalRuns) * 100) : 100;\n\n let color = 'var(--mj-status-success)';\n if (uptime < 90) color = 'var(--mj-status-warning)';\n if (uptime < 80) color = 'var(--mj-status-error)';\n\n return {\n Name: String(source['Name'] || 'Unknown'),\n Uptime: uptime,\n Color: color,\n };\n });\n }\n\n // ================================================================\n // Pipeline Throughput (30-day bars)\n // ================================================================\n\n private buildPipelineThroughput(runs: Record<string, unknown>[]): void {\n const bars: PipelineBar[] = [];\n const labels: string[] = [];\n const now = new Date();\n\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i);\n const dayStr = d.toISOString().slice(0, 10);\n const dayRuns = runs.filter(r => {\n const st = r['StartTime'];\n return st && String(st).slice(0, 10) === dayStr;\n });\n const totalItems = dayRuns.reduce((sum, r) => sum + Number(r['ProcessedItems'] || 0), 0);\n const hasError = dayRuns.some(r => {\n const s = String(r['Status'] || '').toLowerCase();\n return s.includes('error') || s.includes('fail');\n });\n bars.push({ Percentage: totalItems, IsError: hasError });\n\n if (i % 7 === 0) {\n labels.push(`${d.toLocaleString('default', { month: 'short' })} ${d.getDate()}`);\n }\n }\n\n const maxVal = Math.max(...bars.map(b => b.Percentage), 1);\n bars.forEach(b => b.Percentage = Math.max(3, Math.round((b.Percentage / maxVal) * 100)));\n this.PipelineThroughputBars = bars;\n this.PipelineDateLabels = labels;\n }\n\n // ================================================================\n // Processing Stages\n // ================================================================\n\n private buildProcessingStages(runs: Record<string, unknown>[]): void {\n // Derive stage timing from run data\n const completedRuns = runs.filter(r => r['StartTime'] && r['EndTime']);\n if (completedRuns.length === 0) {\n this.ProcessingStages = [\n { Name: 'Ingest', Time: 0, Percentage: 10, Color: 'var(--mj-status-success)' },\n { Name: 'Extract', Time: 0, Percentage: 25, Color: 'var(--mj-brand-primary)' },\n { Name: 'Chunk', Time: 0, Percentage: 6, Color: 'var(--mj-status-success)' },\n { Name: 'Tag', Time: 0, Percentage: 42, Color: 'var(--mj-status-warning)' },\n { Name: 'Vectorize', Time: 0, Percentage: 16, Color: '#7c3aed' },\n ];\n this.TotalAvgProcessingTime = 0;\n this.BottleneckStage = 'Tag';\n this.BottleneckPercent = 42;\n return;\n }\n\n // Average total processing time per item\n const avgTimes = completedRuns.map(r => {\n const start = new Date(String(r['StartTime'])).getTime();\n const end = new Date(String(r['EndTime'])).getTime();\n const items = Math.max(Number(r['ProcessedItems'] || 1), 1);\n return (end - start) / 1000 / items;\n });\n const avgTotal = avgTimes.reduce((a, b) => a + b, 0) / avgTimes.length;\n\n // Estimate stage breakdown (proportional)\n const stages: ProcessingStage[] = [\n { Name: 'Ingest', Time: Math.round(avgTotal * 0.10 * 10) / 10, Percentage: 10, Color: 'var(--mj-status-success)' },\n { Name: 'Extract', Time: Math.round(avgTotal * 0.25 * 10) / 10, Percentage: 25, Color: 'var(--mj-brand-primary)' },\n { Name: 'Chunk', Time: Math.round(avgTotal * 0.06 * 10) / 10, Percentage: 6, Color: 'var(--mj-status-success)' },\n { Name: 'Tag', Time: Math.round(avgTotal * 0.42 * 10) / 10, Percentage: 42, Color: 'var(--mj-status-warning)' },\n { Name: 'Vectorize', Time: Math.round(avgTotal * 0.16 * 10) / 10, Percentage: 16, Color: '#7c3aed' },\n ];\n\n this.ProcessingStages = stages;\n this.TotalAvgProcessingTime = Math.round(avgTotal * 10) / 10;\n this.BottleneckStage = 'Tag';\n this.BottleneckPercent = 42;\n }\n\n // ================================================================\n // Active Runs\n // ================================================================\n\n private buildActiveRuns(): void {\n const activeRuns = this.rawProcessRuns\n .filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'in progress' || status === 'processing';\n })\n .slice(0, 5);\n\n this.ActiveRuns = activeRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : new Date();\n\n return {\n RunID: String(r['ID'] || '').slice(0, 14),\n Source: source ? String(source['Name']) : 'Unknown',\n Started: this.formatRelativeTime(startTime),\n Progress: Math.floor(Math.random() * 80) + 10, // estimated\n Stage: String(r['Status'] || 'Processing'),\n StageClass: 'badge-info',\n Items: Number(r['ProcessedItems'] || 0),\n };\n });\n }\n\n // ================================================================\n // Error Log\n // ================================================================\n\n private buildErrorLog(runs: Record<string, unknown>[]): void {\n const errorRuns = runs\n .filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n })\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 5);\n\n this.ErrorLog = errorRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : new Date();\n\n return {\n Time: startTime.toLocaleString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' }),\n Source: source ? String(source['Name']) : 'Unknown',\n Message: String(r['Status'] || 'Processing error occurred'),\n };\n });\n }\n\n // ================================================================\n // Confidence Histogram\n // ================================================================\n\n private buildConfidenceHistogram(tags: Record<string, unknown>[]): void {\n const bins = new Array(10).fill(0);\n const weights: number[] = [];\n\n for (const tag of tags) {\n const w = Number(tag['Weight'] || 0);\n if (w <= 0) continue;\n weights.push(w);\n const idx = Math.min(Math.floor(w * 10), 9);\n bins[idx]++;\n }\n\n const maxBin = Math.max(...bins, 1);\n const binLabels = ['0.0-0.1', '0.1-0.2', '0.2-0.3', '0.3-0.4', '0.4-0.5', '0.5-0.6', '0.6-0.7', '0.7-0.8', '0.8-0.9', '0.9-1.0'];\n\n this.ConfidenceHistogram = bins.map((count, i) => {\n let color = 'var(--mj-status-error)';\n if (i >= 7) color = 'var(--mj-brand-primary)';\n else if (i >= 5) color = 'var(--mj-status-warning)';\n else if (i >= 3) color = 'var(--mj-status-warning)';\n if (i === 9) color = 'var(--mj-status-success)';\n\n return {\n Label: binLabels[i],\n Count: count,\n Percentage: Math.max(count > 0 ? 5 : 2, Math.round((count / maxBin) * 100)),\n Color: color,\n };\n });\n\n // Stats\n if (weights.length > 0) {\n weights.sort((a, b) => a - b);\n const mean = weights.reduce((a, b) => a + b, 0) / weights.length;\n const median = weights[Math.floor(weights.length / 2)];\n const variance = weights.reduce((sum, w) => sum + Math.pow(w - mean, 2), 0) / weights.length;\n const stdDev = Math.sqrt(variance);\n const p90 = weights[Math.floor(weights.length * 0.9)];\n\n this.ConfidenceStats = [\n { Label: 'Median', Value: median.toFixed(2) },\n { Label: 'Mean', Value: mean.toFixed(2) },\n { Label: 'Std Dev', Value: stdDev.toFixed(2) },\n { Label: 'P90', Value: p90.toFixed(2) },\n { Label: 'Total', Value: `${weights.length} tags` },\n ];\n } else {\n this.ConfidenceStats = [\n { Label: 'Median', Value: 'N/A' },\n { Label: 'Mean', Value: 'N/A' },\n { Label: 'Std Dev', Value: 'N/A' },\n { Label: 'P90', Value: 'N/A' },\n { Label: 'Total', Value: '0 tags' },\n ];\n }\n }\n\n // ================================================================\n // Weight Distribution by Entity\n // ================================================================\n\n private buildWeightByEntity(tags: Record<string, unknown>[]): void {\n const entityWeights = new Map<string, { high: number; med: number; low: number }>();\n\n for (const tag of tags) {\n const w = Number(tag['Weight'] || 0);\n if (w <= 0) continue;\n\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (!item) continue;\n\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n\n if (!entityWeights.has(typeName)) {\n entityWeights.set(typeName, { high: 0, med: 0, low: 0 });\n }\n const entry = entityWeights.get(typeName)!;\n if (w > 0.7) entry.high++;\n else if (w >= 0.4) entry.med++;\n else entry.low++;\n }\n\n this.WeightByEntity = Array.from(entityWeights.entries())\n .sort((a, b) => (b[1].high + b[1].med + b[1].low) - (a[1].high + a[1].med + a[1].low))\n .slice(0, 4)\n .map(([name, counts]) => {\n const total = Math.max(counts.high + counts.med + counts.low, 1);\n return {\n Name: name,\n High: Math.round((counts.high / total) * 100),\n Med: Math.round((counts.med / total) * 100),\n Low: Math.round((counts.low / total) * 100),\n };\n });\n }\n\n // ================================================================\n // Accuracy Trend (line chart)\n // ================================================================\n\n private buildAccuracyTrend(tags: Record<string, unknown>[]): void {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const now = new Date();\n const monthlyAvgs: number[] = [];\n const labels: string[] = [];\n\n for (let i = 6; i >= 0; i--) {\n const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);\n const nextMonth = new Date(now.getFullYear(), now.getMonth() - i + 1, 1);\n labels.push(monthNames[monthDate.getMonth()]);\n\n const monthTags = tags.filter(t => {\n const d = t['__mj_CreatedAt'];\n if (!d) return false;\n const dt = new Date(String(d));\n return dt >= monthDate && dt < nextMonth;\n });\n const weights = monthTags.map(t => Number(t['Weight'] || 0)).filter(w => w > 0);\n const avg = weights.length > 0 ? weights.reduce((a, b) => a + b, 0) / weights.length : 0;\n monthlyAvgs.push(avg);\n }\n\n this.AccuracyMonthLabels = labels;\n\n // Build SVG points (viewBox 0 0 400 110, with y inverted: 0=top=1.0, 110=bottom=0.0)\n const points: string[] = [];\n const dots: { Cx: number; Cy: number }[] = [];\n\n monthlyAvgs.forEach((avg, i) => {\n const x = i * (400 / Math.max(monthlyAvgs.length - 1, 1));\n const y = 110 - (avg * 110);\n points.push(`${x.toFixed(0)},${y.toFixed(0)}`);\n if (i % 2 === 0) dots.push({ Cx: Math.round(x), Cy: Math.round(y) });\n });\n\n this.AccuracyLinePoints = points.join(' ');\n this.AccuracyDots = dots;\n\n // Trend text\n const first = monthlyAvgs[0];\n const last = monthlyAvgs[monthlyAvgs.length - 1];\n if (first > 0 && last > 0) {\n const change = Math.round(((last - first) / first) * 100);\n this.AccuracyTrendText = change >= 0\n ? `Confidence trending upward: ${first.toFixed(2)} -> ${last.toFixed(2)} (+${change}%)`\n : `Confidence declining: ${first.toFixed(2)} -> ${last.toFixed(2)} (${change}%)`;\n } else {\n this.AccuracyTrendText = 'Insufficient data for trend analysis';\n }\n }\n\n // ================================================================\n // Low Confidence Tags\n // ================================================================\n\n private buildLowConfidenceTags(tags: Record<string, unknown>[]): void {\n const tagAvgs = new Map<string, { totalWeight: number; count: number; entities: Map<string, number> }>();\n\n for (const tag of tags) {\n const tagText = String(tag['Tag'] || '');\n const w = Number(tag['Weight'] || 0);\n if (!tagText || w <= 0) continue;\n\n if (!tagAvgs.has(tagText)) {\n tagAvgs.set(tagText, { totalWeight: 0, count: 0, entities: new Map() });\n }\n const entry = tagAvgs.get(tagText)!;\n entry.totalWeight += w;\n entry.count++;\n\n const itemId = String(tag['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n if (item) {\n const ctid = String(item['ContentTypeID'] || '');\n const ct = this.rawContentTypes.find(t => String(t['ID']) === ctid);\n const typeName = ct ? String(ct['Name'] || 'Unknown') : 'Unknown';\n entry.entities.set(typeName, (entry.entities.get(typeName) || 0) + 1);\n }\n }\n\n this.LowConfidenceTags = Array.from(tagAvgs.entries())\n .map(([name, data]) => ({\n name,\n avgWeight: data.totalWeight / data.count,\n count: data.count,\n topEntity: data.entities.size > 0\n ? Array.from(data.entities.entries()).sort((a, b) => b[1] - a[1])[0][0]\n : 'N/A',\n }))\n .filter(t => t.avgWeight < 0.4)\n .sort((a, b) => a.avgWeight - b.avgWeight)\n .slice(0, 7)\n .map(t => ({\n Name: t.name,\n AvgWeight: Math.round(t.avgWeight * 100) / 100,\n UsageCount: t.count,\n TopEntity: t.topEntity,\n SuggestedAction: t.avgWeight < 0.25 ? 'Archive (low relevance)' : 'Review taxonomy placement',\n ActionClass: t.avgWeight < 0.25 ? 'badge-error' : 'badge-warning',\n }));\n }\n\n // ================================================================\n // Model Comparisons\n // ================================================================\n\n private buildModelComparisons(): void {\n // Model comparison requires per-model tag tracking which isn't available yet.\n // Show empty state prompting users to enable model tracking.\n this.ModelComparisons = [];\n this.ModelRecommendation = '';\n\n // If we have content item tags with model info, we could derive this.\n // For now, show an informational message.\n if (this.rawContentItemTags.length === 0) {\n this.ModelRecommendation = 'No autotagging data available yet. Run the autotagging pipeline to generate model performance metrics.';\n } else {\n this.ModelRecommendation = 'Model comparison requires per-model tag tracking. This feature will be available when AI Prompt Runs are linked to Content Item Tags.';\n }\n }\n\n // ================================================================\n // Trending Tags (sidebar)\n // ================================================================\n\n private buildTrendingTags(tags: Record<string, unknown>[]): void {\n const tagCounts = new Map<string, number>();\n const weekAgo = new Date(Date.now() - 14 * 86400000);\n\n for (const tag of tags) {\n const d = tag['__mj_CreatedAt'];\n if (d && new Date(String(d)) >= weekAgo) {\n const tagText = String(tag['Tag'] || '');\n if (tagText) {\n tagCounts.set(tagText, (tagCounts.get(tagText) || 0) + 1);\n }\n }\n }\n\n const sorted = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 10);\n const maxCount = sorted.length > 0 ? sorted[0][1] : 1;\n\n this.TrendingTags = sorted.map(([name, count]) => ({\n Name: name,\n Size: Math.max(10, Math.round((count / maxCount) * 16)),\n Weight: count > maxCount * 0.7 ? 700 : count > maxCount * 0.4 ? 600 : count > maxCount * 0.2 ? 500 : 400,\n }));\n\n // If no recent trending data, use top tags from all time\n if (this.TrendingTags.length === 0) {\n const allTagCounts = new Map<string, number>();\n for (const tag of this.rawContentItemTags) {\n const tagText = String(tag['Tag'] || '');\n if (tagText) allTagCounts.set(tagText, (allTagCounts.get(tagText) || 0) + 1);\n }\n const allSorted = Array.from(allTagCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 10);\n const allMax = allSorted.length > 0 ? allSorted[0][1] : 1;\n this.TrendingTags = allSorted.map(([name, count]) => ({\n Name: name,\n Size: Math.max(10, Math.round((count / allMax) * 16)),\n Weight: count > allMax * 0.7 ? 700 : count > allMax * 0.4 ? 600 : 500,\n }));\n }\n }\n\n // ================================================================\n // Pipeline Status\n // ================================================================\n\n private buildPipelineStatus(runs: Record<string, unknown>[]): void {\n const activeRuns = runs.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status === 'running' || status === 'in progress' || status === 'processing';\n });\n\n const recentErrors = runs.filter(r => {\n const status = String(r['Status'] || '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n });\n\n if (activeRuns.length > 0) {\n this.PipelineStatusText = `${activeRuns.length} pipeline${activeRuns.length > 1 ? 's' : ''} running`;\n this.PipelineStatusOk = true;\n } else if (recentErrors.length > 0) {\n this.PipelineStatusText = `${recentErrors.length} recent error${recentErrors.length > 1 ? 's' : ''}`;\n this.PipelineStatusOk = false;\n } else {\n this.PipelineStatusText = 'All systems operational';\n this.PipelineStatusOk = true;\n }\n }\n\n // ================================================================\n // Drill-Down Data Loading\n // ================================================================\n\n private loadDrillDownData(key: string): void {\n this.DrillDownHasActions = false;\n\n switch (key) {\n case 'kpi-totalTags':\n this.DrillDownColumns = ['Name', 'Display Name', 'Description', 'Parent'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawTags.slice(0, 50).map(t => ({\n 'Name': String(t['Name'] || ''),\n 'Display Name': String(t['DisplayName'] || ''),\n 'Description': String(t['Description'] || '').slice(0, 100),\n 'Parent': String(t['Parent'] || 'Root'),\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n }));\n break;\n\n case 'kpi-itemsProcessed':\n this.DrillDownColumns = ['Name', 'Source', 'Content Type', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawContentItems.slice(0, 50).map(i => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(i['ContentSourceID']));\n const ct = this.rawContentTypes.find(t => String(t['ID']) === String(i['ContentTypeID']));\n return {\n 'Name': String(i['Name'] || ''),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Content Type': ct ? String(ct['Name']) : 'Unknown',\n 'Created': i['__mj_CreatedAt'] ? new Date(String(i['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(i['ID'] || ''),\n '_EntityName': 'MJ: Content Items',\n };\n });\n break;\n\n case 'kpi-avgConfidence':\n case 'kpi-coverage':\n this.DrillDownColumns = ['Tag', 'Item', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawContentItemTags.slice(0, 50).map(t => ({\n 'Tag': String(t['Tag'] || ''),\n 'Item': String(t['Item'] || ''),\n 'Weight': String(t['Weight'] || '0'),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Content Item Tags',\n }));\n break;\n\n case 'tagGrowth':\n case 'contentCoverage':\n case 'qualityScore':\n case 'sourcePerformance':\n case 'dailyThroughput':\n case 'taxonomyHealth':\n this.buildWidgetDrillDown(key);\n break;\n\n default:\n // D10: Handle tab-specific drill-down keys\n if (key.startsWith('tag-row:')) {\n this.buildTagRowDrillDown(key.replace('tag-row:', ''));\n } else if (key.startsWith('source-row:')) {\n this.buildSourceRowDrillDown(key.replace('source-row:', ''));\n } else if (key.startsWith('pipeline-throughput:')) {\n this.buildPipelineThroughputDrillDown(key.replace('pipeline-throughput:', ''));\n } else if (key.startsWith('quality-bin:')) {\n this.buildQualityBinDrillDown(key.replace('quality-bin:', ''));\n } else {\n this.DrillDownColumns = [];\n this.DrillDownData = [];\n }\n }\n\n this.IsDrillDownLoading = false;\n this.cdr.detectChanges();\n }\n\n private buildWidgetDrillDown(key: string): void {\n switch (key) {\n case 'tagGrowth':\n this.DrillDownColumns = ['Tag Name', 'Created'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawTags\n .sort((a, b) => new Date(String(b['__mj_CreatedAt'] || 0)).getTime() - new Date(String(a['__mj_CreatedAt'] || 0)).getTime())\n .slice(0, 50)\n .map(t => ({\n 'Tag Name': String(t['Name'] || ''),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n }));\n break;\n\n case 'contentCoverage':\n this.DrillDownColumns = ['Content Type', 'Total Items', 'Tagged Items', 'Coverage %'];\n this.DrillDownData = this.CoverageData.map(c => ({\n 'Content Type': c.Name,\n 'Total Items': c.Total,\n 'Tagged Items': c.Tagged,\n 'Coverage %': `${c.Percentage}%`,\n }));\n break;\n\n case 'qualityScore':\n this.DrillDownColumns = ['Bin', 'Count'];\n this.DrillDownData = this.ConfidenceHistogram.map(b => ({\n 'Bin': b.Label,\n 'Count': b.Count,\n }));\n break;\n\n case 'sourcePerformance':\n this.DrillDownColumns = ['Source', 'Avg Tags/Item'];\n this.DrillDownData = this.SourcePerfData.map(s => ({\n 'Source': s.Name,\n 'Avg Tags/Item': s.AvgTagsPerItem,\n }));\n break;\n\n case 'dailyThroughput':\n this.DrillDownColumns = ['Run ID', 'Source', 'Status', 'Items', 'Started'];\n this.DrillDownHasActions = true;\n this.DrillDownData = this.rawProcessRuns\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 30)\n .map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n return {\n 'Run ID': String(r['ID'] || '').slice(0, 14),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Status': String(r['Status'] || ''),\n 'Items': Number(r['ProcessedItems'] || 0),\n 'Started': r['StartTime'] ? new Date(String(r['StartTime'])).toLocaleString() : '',\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n break;\n\n case 'taxonomyHealth':\n this.DrillDownColumns = ['Tag', 'Has Children', 'Is Used', 'Status'];\n this.DrillDownHasActions = true;\n const parentIds = new Set(this.rawTags.filter(t => t['ParentID']).map(t => String(t['ParentID'])));\n const usedIds = new Set(this.rawContentItemTags.filter(ct => ct['TagID']).map(ct => String(ct['TagID'])));\n this.DrillDownData = this.rawTags.slice(0, 50).map(t => {\n const tid = String(t['ID']);\n const hasChildren = parentIds.has(tid);\n const isUsed = usedIds.has(tid);\n let status = 'Orphaned';\n if (hasChildren || isUsed) status = 'Healthy';\n else if (t['ParentID']) status = 'Attention';\n return {\n 'Tag': String(t['Name'] || ''),\n 'Has Children': hasChildren ? 'Yes' : 'No',\n 'Is Used': isUsed ? 'Yes' : 'No',\n 'Status': status,\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Tags',\n };\n });\n break;\n }\n }\n\n // ================================================================\n // D10: Tab-Specific Drill-Down Builders\n // ================================================================\n\n /**\n * D10 Tags tab: Click a tag row to see content items using that tag.\n */\n private buildTagRowDrillDown(tagName: string): void {\n this.DrillDownColumns = ['Item Name', 'Source', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n\n const matchingTags = this.rawContentItemTags.filter(\n t => String(t['Tag'] || '') === tagName\n );\n\n this.DrillDownData = matchingTags.slice(0, 50).map(t => {\n const itemId = String(t['ItemID'] || '');\n const item = this.rawContentItems.find(i => String(i['ID']) === itemId);\n const source = item\n ? this.rawContentSources.find(s => String(s['ID']) === String(item['ContentSourceID']))\n : null;\n return {\n 'Item Name': item ? String(item['Name'] || '') : 'Unknown',\n 'Source': source ? String(source['Name'] || '') : 'Unknown',\n 'Weight': String(t['Weight'] || '0'),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': itemId,\n '_EntityName': 'MJ: Content Items',\n };\n });\n }\n\n /**\n * D10 Sources tab: Click a source row to see recent runs, items, and errors.\n */\n private buildSourceRowDrillDown(sourceName: string): void {\n const source = this.rawContentSources.find(s => String(s['Name']) === sourceName);\n if (!source) {\n this.DrillDownColumns = [];\n this.DrillDownData = [];\n return;\n }\n\n const sid = String(source['ID']);\n const sourceRuns = this.rawProcessRuns\n .filter(r => String(r['SourceID']) === sid)\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 20);\n\n this.DrillDownColumns = ['Status', 'Items Processed', 'Start Time', 'Duration'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = sourceRuns.map(r => {\n const startTime = r['StartTime'] ? new Date(String(r['StartTime'])) : null;\n const endTime = r['EndTime'] ? new Date(String(r['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n return {\n 'Status': String(r['Status'] || 'Unknown'),\n 'Items Processed': Number(r['ProcessedItems'] || 0),\n 'Start Time': startTime ? startTime.toLocaleString() : '',\n 'Duration': durationStr,\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n }\n\n /**\n * D10 Pipeline tab: Click throughput chart to see individual run details.\n */\n private buildPipelineThroughputDrillDown(dayIndex: string): void {\n const idx = parseInt(dayIndex, 10);\n const now = new Date();\n const targetDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (29 - idx));\n const dayStr = targetDate.toISOString().slice(0, 10);\n\n const dayRuns = this.rawProcessRuns.filter(r => {\n const st = r['StartTime'];\n return st && String(st).slice(0, 10) === dayStr;\n });\n\n this.DrillDownColumns = ['Run ID', 'Source', 'Status', 'Items', 'Start Time'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = dayRuns.map(r => {\n const source = this.rawContentSources.find(s => String(s['ID']) === String(r['SourceID']));\n return {\n 'Run ID': String(r['ID'] || '').slice(0, 14),\n 'Source': source ? String(source['Name']) : 'Unknown',\n 'Status': String(r['Status'] || ''),\n 'Items': Number(r['ProcessedItems'] || 0),\n 'Start Time': r['StartTime'] ? new Date(String(r['StartTime'])).toLocaleString() : '',\n '_RecordID': String(r['ID'] || ''),\n '_EntityName': 'MJ: Content Process Runs',\n };\n });\n }\n\n /**\n * D10 Quality tab: Click confidence histogram bin to see matching items.\n */\n private buildQualityBinDrillDown(binLabel: string): void {\n // Parse bin range from label like \"0.7-0.8\"\n const parts = binLabel.split('-');\n const lo = parseFloat(parts[0]);\n const hi = parts.length > 1 ? parseFloat(parts[1]) : lo + 0.1;\n\n const matchingTags = this.rawContentItemTags.filter(t => {\n const w = Number(t['Weight'] || 0);\n return w >= lo && w < hi;\n });\n\n this.DrillDownColumns = ['Tag', 'Item', 'Weight', 'Created'];\n this.DrillDownHasActions = true;\n\n this.DrillDownData = matchingTags.slice(0, 50).map(t => ({\n 'Tag': String(t['Tag'] || ''),\n 'Item': String(t['Item'] || ''),\n 'Weight': String(Number(t['Weight'] || 0).toFixed(3)),\n 'Created': t['__mj_CreatedAt'] ? new Date(String(t['__mj_CreatedAt'])).toLocaleDateString() : '',\n '_RecordID': String(t['ID'] || ''),\n '_EntityName': 'MJ: Content Item Tags',\n }));\n }\n\n // ================================================================\n // D1: Cost & Usage Aggregation\n // ================================================================\n\n /**\n * Aggregates cost and token data from ContentProcessRunDetail records.\n * Each detail record has TotalTokensUsed and TotalCost fields that are\n * pre-rolled-up from linked AIPromptRun records.\n */\n private buildCostUsageData(filteredRuns: Record<string, unknown>[]): void {\n // Filter run details to match the current date range by joining to filtered runs\n const filteredRunIds = new Set(filteredRuns.map(r => String(r['ID'] || '')));\n const filteredDetails = this.rawRunDetails.filter(\n d => filteredRunIds.has(String(d['ContentProcessRunID'] || ''))\n );\n\n const totalTokens = this.sumField(filteredDetails, 'TotalTokensUsed');\n const totalCost = this.sumField(filteredDetails, 'TotalCost');\n const runCount = filteredRuns.length;\n const avgCostPerRun = runCount > 0 ? totalCost / runCount : 0;\n\n this.CostKPIs = [\n {\n Label: 'Total Tokens Used',\n Value: this.formatLargeNumber(totalTokens),\n Icon: 'fa-solid fa-microchip',\n SubLabel: `Across ${runCount} run${runCount !== 1 ? 's' : ''}`,\n },\n {\n Label: 'Total Cost',\n Value: totalCost > 0 ? `$${totalCost.toFixed(4)}` : '$0.00',\n Icon: 'fa-solid fa-dollar-sign',\n SubLabel: 'Estimated from AI model usage',\n },\n {\n Label: 'Avg Cost / Run',\n Value: avgCostPerRun > 0 ? `$${avgCostPerRun.toFixed(4)}` : '$0.00',\n Icon: 'fa-solid fa-calculator',\n SubLabel: runCount > 0 ? `${runCount} total runs` : 'No runs yet',\n },\n ];\n\n // Build per-run cost breakdown from detail records\n this.CostPerRunRows = this.buildCostPerRunRows(filteredRuns, filteredDetails);\n }\n\n /** Sum a numeric field across an array of raw records */\n public static SumField(records: Record<string, unknown>[], fieldName: string): number {\n return records.reduce((sum, r) => sum + Number(r[fieldName] || 0), 0);\n }\n\n private sumField(records: Record<string, unknown>[], fieldName: string): number {\n return AnalyticsResourceComponent.SumField(records, fieldName);\n }\n\n private formatLargeNumber(n: number): string {\n if (n >= 1000000) return `${(n / 1000000).toFixed(1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n return String(Math.round(n));\n }\n\n private buildCostPerRunRows(\n runs: Record<string, unknown>[],\n details: Record<string, unknown>[],\n ): { RunID: string; Source: string; Tokens: number; Cost: number; Started: string }[] {\n // Group details by run\n const detailsByRun = new Map<string, Record<string, unknown>[]>();\n for (const d of details) {\n const runId = String(d['ContentProcessRunID'] || '');\n if (!detailsByRun.has(runId)) detailsByRun.set(runId, []);\n detailsByRun.get(runId)!.push(d);\n }\n\n return runs\n .sort((a, b) => new Date(String(b['StartTime'] || 0)).getTime() - new Date(String(a['StartTime'] || 0)).getTime())\n .slice(0, 20)\n .map(run => {\n const runId = String(run['ID'] || '');\n const runDetails = detailsByRun.get(runId) || [];\n const tokens = this.sumField(runDetails, 'TotalTokensUsed');\n const cost = this.sumField(runDetails, 'TotalCost');\n const source = this.rawContentSources.find(s => String(s['ID']) === String(run['SourceID']));\n\n return {\n RunID: runId.slice(0, 14),\n Source: source ? String(source['Name']) : 'Unknown',\n Tokens: tokens,\n Cost: cost,\n Started: run['StartTime'] ? new Date(String(run['StartTime'])).toLocaleString() : '',\n };\n });\n }\n\n // ================================================================\n // D5: Print-Friendly Export\n // ================================================================\n\n /**\n * D5: Opens the browser print dialog with print-friendly CSS.\n * This is a zero-dependency approach to PDF export.\n * NOTE: For full XLSX export, an xlsx library (e.g. SheetJS) can be added later.\n */\n public PrintCurrentTab(): void {\n window.print();\n }\n\n // ================================================================\n // SR-6: Preference Persistence\n // ================================================================\n\n private static readonly PREFS_KEY = 'KH_Analytics_Preferences';\n\n private persistAnalyticsPreferences(): void {\n const prefs = JSON.stringify({\n ActiveTab: this.ActiveTab,\n ActiveDateRange: this.ActiveDateRange,\n EntityFilter: this.EntityFilter,\n });\n UserInfoEngine.Instance.SetSettingDebounced(AnalyticsResourceComponent.PREFS_KEY, prefs);\n }\n\n private loadAnalyticsPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(AnalyticsResourceComponent.PREFS_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw);\n if (prefs.ActiveTab) this.ActiveTab = prefs.ActiveTab;\n if (prefs.ActiveDateRange) this.ActiveDateRange = prefs.ActiveDateRange;\n if (prefs.EntityFilter) this.EntityFilter = prefs.EntityFilter;\n } catch { /* ignore */ }\n }\n }\n\n // ================================================================\n // Co-Occurrence Data\n // ================================================================\n\n /**\n * Load the top 20 co-occurring tag pairs and the staleness timestamp.\n * Runs in background so it does not block initial render.\n */\n private async loadCoOccurrenceData(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<{\n TagA: string; TagB: string; CoOccurrenceCount: number; LastComputedAt: string | null;\n }>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: 'CoOccurrenceCount > 0',\n OrderBy: 'CoOccurrenceCount DESC',\n MaxRows: 20,\n Fields: ['TagA', 'TagB', 'CoOccurrenceCount', 'LastComputedAt'],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results.length > 0) {\n const maxCount = result.Results[0].CoOccurrenceCount;\n this.CoOccurrencePairs = result.Results.map(row => ({\n TagAName: row.TagA,\n TagBName: row.TagB,\n Count: row.CoOccurrenceCount,\n BarWidth: maxCount > 0 ? Math.round((row.CoOccurrenceCount / maxCount) * 100) : 0,\n }));\n\n // Find the most recent LastComputedAt value for staleness indicator\n const computedDates = result.Results\n .map(r => r.LastComputedAt)\n .filter((d): d is string => d != null)\n .map(d => new Date(d))\n .filter(d => !isNaN(d.getTime()));\n\n if (computedDates.length > 0) {\n const latest = new Date(Math.max(...computedDates.map(d => d.getTime())));\n this.CoOccurrenceLastComputed = this.formatRelativeTime(latest);\n }\n }\n this.cdr.detectChanges();\n } catch (error) {\n console.error('[Analytics] Error loading co-occurrence data:', error);\n }\n }\n\n /** Recompute co-occurrence data (triggered by user button click) */\n public async RecomputeCoOccurrence(): Promise<void> {\n if (this.IsRecomputingCoOccurrence) return;\n this.IsRecomputingCoOccurrence = true;\n this.cdr.detectChanges();\n\n try {\n const provider = Metadata.Provider as unknown;\n const gql = `\n mutation RecomputeTagCoOccurrence {\n RecomputeTagCoOccurrence {\n PairsUpdated\n PairsDeleted\n }\n }\n `;\n // If GraphQL mutation not available, fall back to client-side reload\n try {\n const gqlProvider = provider as { ExecuteGQL: (query: string, variables: Record<string, unknown>) => Promise<unknown> };\n if (typeof gqlProvider.ExecuteGQL === 'function') {\n await gqlProvider.ExecuteGQL(gql, {});\n }\n } catch {\n // Mutation not available on server, just reload\n }\n\n // Reload the data\n await this.loadCoOccurrenceData();\n } finally {\n this.IsRecomputingCoOccurrence = false;\n this.cdr.detectChanges();\n }\n }\n\n // NOTE: formatRelativeTime is defined above in the Source Detail section.\n}\n\n/** Tree-shaking prevention */\nexport function LoadAnalyticsResource(): void {\n // Prevents tree-shaking\n}\n","@if (IsLoading) {\n <div class=\"analytics-loading\">\n <mj-loading text=\"Loading analytics data...\" size=\"medium\"></mj-loading>\n </div>\n} @else {\n <div class=\"analytics-layout\">\n <!-- =============== LEFT SIDEBAR =============== -->\n <aside class=\"analytics-sidebar\">\n <div class=\"sidebar-header\">\n <h2><i class=\"fa-solid fa-chart-line\"></i> Analytics</h2>\n </div>\n\n <nav class=\"sidebar-nav\">\n @for (nav of NavItems; track nav.ID) {\n <button\n class=\"nav-item\"\n [class.active]=\"ActiveTab === nav.ID\"\n (click)=\"SelectTab(nav.ID)\"\n >\n <i [class]=\"nav.Icon\"></i> {{ nav.Label }}\n </button>\n }\n </nav>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Trending Tags Cloud -->\n <div class=\"trending-section\">\n <h3><i class=\"fa-solid fa-arrow-trend-up\"></i> Trending Tags</h3>\n <div class=\"tag-cloud\">\n @for (tag of TrendingTags; track tag.Name) {\n <span [style.font-size.px]=\"tag.Size\" [style.font-weight]=\"tag.Weight\">{{ tag.Name }}</span>\n }\n @if (TrendingTags.length === 0) {\n <span class=\"no-trending\">No trending tags yet</span>\n }\n </div>\n </div>\n\n <!-- Pipeline Status -->\n <div class=\"pipeline-status\">\n <span class=\"status-dot\" [class.status-dot-error]=\"!PipelineStatusOk\"></span>\n {{ PipelineStatusText }}\n </div>\n </aside>\n\n <!-- =============== MAIN CONTENT =============== -->\n <div class=\"main-content\">\n\n <!-- ====================================================== -->\n <!-- TAB 1: OVERVIEW -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'overview') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-grip\"></i>\n <h1>Overview</h1>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"date-chips\">\n @for (range of DateRanges; track range.Label) {\n <button\n class=\"date-chip\"\n [class.active]=\"ActiveDateRange === range.Label\"\n (click)=\"SetDateRange(range.Label)\"\n >{{ range.Label }}</button>\n }\n </div>\n <select class=\"filter-dropdown\" [ngModel]=\"EntityFilter\" (ngModelChange)=\"SetEntityFilter($event)\">\n @for (opt of EntityFilterOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n\n <!-- KPI Cards -->\n <div class=\"kpi-row\">\n @for (kpi of KPIs; track kpi.Label) {\n <div class=\"kpi-card\" (click)=\"OpenDrillDown(kpi.DrillDownKey)\">\n <div>\n <div class=\"kpi-label\">{{ kpi.Label }}</div>\n <div class=\"kpi-value\">{{ kpi.Value }}</div>\n <div class=\"kpi-delta\" [class.up]=\"kpi.DeltaDirection === 'up'\" [class.down]=\"kpi.DeltaDirection === 'down'\">\n @if (kpi.DeltaDirection === 'up') {\n <i class=\"fa-solid fa-arrow-up\" style=\"font-size:9px\"></i>\n } @else if (kpi.DeltaDirection === 'down') {\n <i class=\"fa-solid fa-arrow-down\" style=\"font-size:9px\"></i>\n }\n {{ kpi.Delta }}\n </div>\n </div>\n <div class=\"kpi-sparkline\">\n <svg width=\"64\" height=\"28\" viewBox=\"0 0 64 28\">\n <polyline [attr.points]=\"kpi.SparklinePoints\" fill=\"none\" [attr.stroke]=\"kpi.SparklineColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n </div>\n\n <!-- KPI Drill-Down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('kpi-')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Detail View</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of DrillDownColumns; track col) {\n <th>{{ col }}</th>\n }\n @if (DrillDownHasActions) {\n <th class=\"drill-action-col\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) {\n <td>{{ row[col] }}</td>\n }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No data available</div>\n }\n </div>\n }\n\n <!-- Widget Cards Grid (2x3) -->\n <div class=\"cards-grid\">\n\n <!-- Card 1: Tag Growth -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('tagGrowth')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-chart-line\"></i> Tag Growth</div>\n <div class=\"bar-chart\">\n @for (bar of TagGrowthData; track bar.Label) {\n <div class=\"bar-col\">\n <div class=\"bar-value\">{{ bar.Count }}</div>\n <div class=\"bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.opacity]=\"0.5 + (bar.Percentage / 200)\"></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Card 2: Content Coverage -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('contentCoverage')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-bullseye\"></i> Content Coverage</div>\n <div class=\"rings-grid\">\n @for (entity of CoverageData; track entity.Name) {\n <div class=\"ring-item\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\">\n <circle cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"5\"/>\n <circle cx=\"24\" cy=\"24\" r=\"20\" fill=\"none\" [attr.stroke]=\"entity.Color\" stroke-width=\"5\"\n [attr.stroke-dasharray]=\"entity.StrokeDash\" stroke-dashoffset=\"31.4\" stroke-linecap=\"round\"\n transform=\"rotate(-90 24 24)\"/>\n <text x=\"24\" y=\"26\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"700\" fill=\"var(--mj-text-primary)\">{{ entity.Percentage }}%</text>\n </svg>\n <div>\n <div class=\"ring-label\">{{ entity.Name }}</div>\n <div class=\"ring-stat\">{{ FormatNumber(entity.Tagged) }} / {{ FormatNumber(entity.Total) }}</div>\n </div>\n </div>\n }\n @if (CoverageData.length === 0) {\n <div class=\"widget-empty\">No content types found</div>\n }\n </div>\n </div>\n\n <!-- Card 3: Quality Score Gauge -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('qualityScore')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-gauge-high\"></i> Quality Score</div>\n <div class=\"gauge-container\">\n <svg width=\"180\" height=\"110\" viewBox=\"0 0 180 110\">\n <!-- Background arc -->\n <path d=\"M 20 95 A 70 70 0 0 1 160 95\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"14\" stroke-linecap=\"round\"/>\n <!-- Zone arcs -->\n <path d=\"M 20 95 A 70 70 0 0 1 48.6 35.2\" fill=\"none\" stroke=\"var(--mj-status-error)\" stroke-width=\"14\" stroke-linecap=\"round\" opacity=\"0.3\"/>\n <path d=\"M 48.6 35.2 A 70 70 0 0 1 118 28\" fill=\"none\" stroke=\"var(--mj-status-warning)\" stroke-width=\"14\" opacity=\"0.3\"/>\n <path d=\"M 118 28 A 70 70 0 0 1 160 95\" fill=\"none\" stroke=\"var(--mj-status-success)\" stroke-width=\"14\" stroke-linecap=\"round\" opacity=\"0.3\"/>\n <!-- Score text -->\n <text x=\"90\" y=\"88\" text-anchor=\"middle\" font-size=\"26\" font-weight=\"800\" fill=\"var(--mj-text-primary)\">{{ QualityScore }}</text>\n <text x=\"90\" y=\"105\" text-anchor=\"middle\" font-size=\"10\" fill=\"var(--mj-text-muted)\">out of 100</text>\n <text x=\"28\" y=\"108\" font-size=\"8\" fill=\"var(--mj-text-muted)\">0</text>\n <text x=\"86\" y=\"18\" font-size=\"8\" fill=\"var(--mj-text-muted)\">50</text>\n <text x=\"155\" y=\"108\" font-size=\"8\" fill=\"var(--mj-text-muted)\">100</text>\n </svg>\n </div>\n <!-- Mini confidence histogram -->\n <div class=\"mini-histogram\">\n @for (bin of MiniConfidenceBins; track TrackByIndex($index)) {\n <div class=\"mini-hist-bar\" [style.height.px]=\"bin.Height\" [style.background]=\"bin.Color\" [title]=\"bin.Title\"></div>\n }\n </div>\n <div class=\"mini-hist-label\">Confidence Distribution</div>\n </div>\n\n <!-- Card 4: Source Performance -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('sourcePerformance')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-ranking-star\"></i> Source Performance</div>\n <div class=\"h-bar-list\">\n @for (source of SourcePerfData; track source.Name) {\n <div class=\"h-bar-row\">\n <div class=\"h-bar-name\">{{ source.Name }}</div>\n <div class=\"h-bar-track\">\n <div class=\"h-bar-fill\" [style.width.%]=\"source.Percentage\" [style.background]=\"source.Color\">{{ source.AvgTagsPerItem }}</div>\n </div>\n </div>\n }\n @if (SourcePerfData.length === 0) {\n <div class=\"widget-empty\">No source data</div>\n }\n </div>\n <div class=\"widget-footnote\">Average tags per item</div>\n </div>\n\n <!-- Card 5: Daily Throughput -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('dailyThroughput')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-bolt\"></i> Daily Throughput</div>\n <div class=\"throughput-bars\">\n @for (day of ThroughputData; track day.Label) {\n <div class=\"tp-bar\"\n [style.height.%]=\"day.Percentage\"\n [style.background]=\"day.IsError ? 'var(--mj-status-error)' : 'var(--mj-status-success)'\"\n >\n <span class=\"tp-bar-label\">{{ day.Label }}</span>\n </div>\n }\n </div>\n <div class=\"legend\">\n <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--mj-status-success)\"></div> Success</div>\n <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--mj-status-error)\"></div> Failures</div>\n </div>\n </div>\n\n <!-- Card 6: Taxonomy Health -->\n <div class=\"widget-card\" (click)=\"OpenDrillDown('taxonomyHealth')\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-sitemap\"></i> Taxonomy Health</div>\n <div class=\"taxonomy-ring-container\">\n <svg width=\"140\" height=\"140\" viewBox=\"0 0 140 140\">\n <circle cx=\"70\" cy=\"70\" r=\"54\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"18\"/>\n @for (seg of TaxonomyRingSegments; track TrackByIndex($index)) {\n <circle cx=\"70\" cy=\"70\" r=\"54\" fill=\"none\"\n [attr.stroke]=\"seg.Color\" stroke-width=\"18\"\n [attr.stroke-dasharray]=\"seg.StrokeDash\"\n [attr.stroke-dashoffset]=\"seg.StrokeOffset\"\n transform=\"rotate(-90 70 70)\"/>\n }\n <text x=\"70\" y=\"66\" text-anchor=\"middle\" font-size=\"22\" font-weight=\"800\" fill=\"var(--mj-text-primary)\">{{ TaxonomyTotal }}</text>\n <text x=\"70\" y=\"82\" text-anchor=\"middle\" font-size=\"10\" fill=\"var(--mj-text-muted)\">total tags</text>\n </svg>\n </div>\n <div class=\"taxonomy-stats\">\n @for (stat of TaxonomyStats; track stat.Label) {\n <div class=\"tax-stat\" [style.background]=\"stat.BgColor\" [style.color]=\"stat.Color\">\n {{ stat.Count }}<small>{{ stat.Label }}</small>\n </div>\n }\n </div>\n </div>\n\n </div><!-- /cards-grid -->\n\n <!-- Widget Drill-Down -->\n @if (DrillDownTarget && !DrillDownTarget.startsWith('kpi-')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> {{ DrillDownTarget }} Detail</span>\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of DrillDownColumns; track col) {\n <th>{{ col }}</th>\n }\n @if (DrillDownHasActions) {\n <th class=\"drill-action-col\"></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) {\n <td>{{ row[col] }}</td>\n }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No data available</div>\n }\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 2: TAGS -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'tags') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-tags\"></i>\n <h1>Tags</h1>\n </div>\n\n <!-- Top 20 Tags Table -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <div class=\"sub-section-header\">\n <h3><i class=\"fa-solid fa-trophy\"></i> Top 20 Tags</h3>\n @if (TopTags.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportTabDataCSV('top-tags')\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n </div>\n @if (TopTags.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>Tag Name</th>\n <th class=\"num\">Usage Count</th>\n <th>Avg Weight</th>\n <th>Trend</th>\n <th>Top Entity</th>\n <th>First Seen</th>\n </tr>\n </thead>\n <tbody>\n @for (tag of TopTags; track tag.Name) {\n <tr style=\"cursor:pointer\" (click)=\"OpenDrillDown('tag-row:' + tag.Name)\">\n <td>{{ tag.Rank }}</td>\n <td><strong>{{ tag.Name }}</strong></td>\n <td class=\"num\">{{ FormatNumber(tag.UsageCount) }}</td>\n <td>\n <span class=\"weight-bar\" [style.width.px]=\"tag.WeightBarWidth\" [style.background]=\"tag.WeightBarColor\"></span>\n {{ tag.AvgWeight }}\n </td>\n <td>\n <svg width=\"48\" height=\"16\">\n <polyline [attr.points]=\"tag.TrendPoints\" fill=\"none\" [attr.stroke]=\"tag.TrendColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </td>\n <td>{{ tag.TopEntity }}</td>\n <td class=\"muted\">{{ tag.FirstSeen }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-tags\"></i>\n <p>No tag data available yet. Process content to generate tags.</p>\n </div>\n }\n </div>\n\n <!-- D10: Tags tab drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('tag-row:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Content Items Tagged \"{{ DrillDownTarget.replace('tag-row:', '') }}\"</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n }\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" aria-label=\"Open record\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No items found for this tag</div>\n }\n </div>\n }\n\n <!-- Tag Distribution by Entity -->\n @if (EntityDistribution.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Tag Distribution by Entity</h3>\n <div class=\"stacked-bar-chart\">\n @for (row of EntityDistribution; track row.EntityName) {\n <div class=\"stacked-row\">\n <div class=\"stacked-label\">{{ row.EntityName }}</div>\n <div class=\"stacked-track\">\n @for (seg of row.Segments; track TrackByIndex($index)) {\n <div class=\"stacked-seg\" [style.width.%]=\"seg.Percentage\" [style.background]=\"seg.Color\" [title]=\"seg.Label + ': ' + seg.Percentage + '%'\">{{ seg.Label }}</div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"legend\" style=\"margin-top:12px\">\n @for (item of DistributionLegend; track item.Label) {\n <div class=\"legend-item\"><div class=\"legend-dot\" [style.background]=\"item.Color\"></div> {{ item.Label }}</div>\n }\n </div>\n </div>\n }\n\n <!-- Tag Depth Distribution -->\n @if (TagDepthBars.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Tag Depth Distribution</h3>\n <div class=\"v-bar-chart\">\n @for (bar of TagDepthBars; track bar.Label) {\n <div class=\"v-bar-col\">\n <div class=\"v-bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.min-height.px]=\"bar.Count > 0 ? 24 : 0\">{{ bar.Count }}</div>\n <div class=\"v-bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n <div class=\"chart-footnote\">\n Taxonomy hierarchy depth -- Most tags at depth 2-3 indicating a healthy mid-level structure\n </div>\n </div>\n }\n\n <!-- Frequently Paired Tags (Co-Occurrence) -->\n <div class=\"sub-section co-occurrence-section\">\n <div class=\"sub-section-header\">\n <h3><i class=\"fa-solid fa-link\"></i> Frequently Paired Tags</h3>\n <div class=\"co-occurrence-actions\">\n @if (CoOccurrenceLastComputed) {\n <span class=\"co-occurrence-staleness\" title=\"Last computed timestamp\">\n <i class=\"fa-regular fa-clock\"></i>\n Last computed: {{ CoOccurrenceLastComputed }}\n </span>\n }\n <button class=\"drill-export-btn\" (click)=\"RecomputeCoOccurrence()\" [disabled]=\"IsRecomputingCoOccurrence\" title=\"Recompute co-occurrence data\">\n @if (IsRecomputingCoOccurrence) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Computing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Recompute\n }\n </button>\n </div>\n </div>\n @if (CoOccurrencePairs.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>Tag A</th>\n <th>Tag B</th>\n <th class=\"num\">Co-Occurrences</th>\n <th>Frequency</th>\n </tr>\n </thead>\n <tbody>\n @for (pair of CoOccurrencePairs; track pair.TagAName + pair.TagBName; let i = $index) {\n <tr>\n <td class=\"muted\">{{ i + 1 }}</td>\n <td><strong>{{ pair.TagAName }}</strong></td>\n <td><strong>{{ pair.TagBName }}</strong></td>\n <td class=\"num\">{{ FormatNumber(pair.Count) }}</td>\n <td>\n <span class=\"weight-bar\" [style.width.px]=\"pair.BarWidth\" style=\"background: var(--mj-status-info)\"></span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No co-occurrence data available yet. Process content and recompute to see which tags frequently appear together.</p>\n </div>\n }\n </div>\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 3: SOURCES -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'sources') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-database\"></i>\n <h1>Sources</h1>\n </div>\n\n <!-- Source Comparison Table -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-table\"></i> Source Comparison</h3>\n @if (SourceComparison.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Source Name</th>\n <th>Type</th>\n <th class=\"num\">Items</th>\n <th class=\"num\">Tags Generated</th>\n <th class=\"num\">Avg Tags/Item</th>\n <th class=\"num\">Avg Weight</th>\n <th>Last Run</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n @for (source of SourceComparison; track source.Name) {\n <tr (click)=\"SelectSource(source.Name); OpenDrillDown('source-row:' + source.Name)\" style=\"cursor:pointer\" [class.source-selected]=\"SelectedSourceName === source.Name\">\n <td><strong>{{ source.Name }}</strong></td>\n <td><i [class]=\"source.TypeIcon\" [style.color]=\"source.TypeColor\" style=\"margin-right:4px\"></i> {{ source.Type }}</td>\n <td class=\"num\">{{ FormatNumber(source.Items) }}</td>\n <td class=\"num\">{{ FormatNumber(source.TagsGenerated) }}</td>\n <td class=\"num\">{{ source.AvgTagsPerItem }}</td>\n <td class=\"num\">{{ source.AvgWeight }}</td>\n <td class=\"muted\">{{ source.LastRun }}</td>\n <td><span class=\"badge\" [class]=\"source.StatusClass\"><i class=\"fa-solid fa-circle\" style=\"font-size:6px;margin-right:3px\"></i> {{ source.Status }}</span></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No content sources configured yet.</p>\n </div>\n }\n </div>\n\n <!-- D10: Sources tab drill-down (recent runs) -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('source-row:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Recent Runs: {{ DrillDownTarget.replace('source-row:', '') }}</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" aria-label=\"Open record\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No run data for this source</div>\n }\n </div>\n }\n\n <!-- Per-Source Detail -->\n @if (SelectedSourceName && SourceComparison.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-area\"></i> Source Detail: {{ SelectedSourceName }}</h3>\n <div class=\"two-col\">\n <!-- Items Processed Over Time -->\n <div class=\"widget-card\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-chart-bar\"></i> Items Processed (Last 8 Weeks)</div>\n <div class=\"bar-chart\" style=\"height:100px\">\n @for (bar of SourceWeeklyBars; track bar.Label) {\n <div class=\"bar-col\">\n <div class=\"bar-value\" style=\"font-size:9px\">{{ bar.Value }}</div>\n <div class=\"bar\" [style.height.%]=\"bar.Percentage\" style=\"background:var(--mj-brand-primary)\" [style.opacity]=\"0.5 + (bar.Percentage / 200)\"></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag Quality Distribution -->\n <div class=\"widget-card\">\n <div class=\"widget-title\"><i class=\"fa-solid fa-star-half-stroke\"></i> Tag Quality Distribution</div>\n <div class=\"quality-bands\">\n @for (band of SourceQualityBands; track band.Label) {\n <div class=\"quality-band-row\">\n <span class=\"quality-band-label\">{{ band.Label }}</span>\n <div class=\"quality-band-track\">\n <div class=\"quality-band-fill\" [style.width.%]=\"band.Percentage\" [style.background]=\"band.Color\">{{ band.Percentage }}%</div>\n </div>\n </div>\n }\n </div>\n <div class=\"source-quality-note\">\n <i class=\"fa-solid fa-circle-info\" style=\"color:var(--mj-status-info);margin-right:4px\"></i>\n {{ SourceQualityNote }}\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Source Health -->\n @if (SourceHealthCards.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Source Health Summary</h3>\n <div class=\"source-health-grid\" [style.grid-template-columns]=\"'repeat(' + SourceHealthCards.length + ', 1fr)'\">\n @for (card of SourceHealthCards; track card.Name) {\n <div class=\"source-health-card\" [style.border-top-color]=\"card.Color\">\n <div class=\"health-card-name\">{{ card.Name }}</div>\n <div class=\"health-card-value\" [style.color]=\"card.Color\">{{ card.Uptime }}%</div>\n <div class=\"health-card-label\">uptime</div>\n </div>\n }\n </div>\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 4: PIPELINE -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'pipeline') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <h1>Pipeline</h1>\n </div>\n\n <!-- Pipeline Throughput Chart -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Pipeline Throughput (Last 30 Days)</h3>\n <div class=\"widget-card\">\n <div class=\"pipeline-throughput-bars\">\n @for (bar of PipelineThroughputBars; track TrackByIndex($index)) {\n <div class=\"pipeline-bar\"\n [style.height.%]=\"bar.Percentage\"\n [style.background]=\"bar.IsError ? 'var(--mj-status-error)' : 'var(--mj-brand-primary)'\"\n [style.opacity]=\"bar.IsError ? 0.7 : (0.6 + bar.Percentage / 300)\"\n style=\"cursor:pointer\"\n (click)=\"OpenDrillDown('pipeline-throughput:' + $index)\"\n ></div>\n }\n </div>\n <div class=\"pipeline-date-labels\">\n @for (label of PipelineDateLabels; track label) {\n <span>{{ label }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- D10: Pipeline throughput drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('pipeline-throughput:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Runs for Selected Day</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" aria-label=\"Open record\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No runs for this day</div>\n }\n </div>\n }\n\n <!-- Processing Time Breakdown -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-stopwatch\"></i> Processing Time Breakdown (Avg per Item)</h3>\n <div class=\"widget-card\">\n <div class=\"stage-bars\">\n @for (stage of ProcessingStages; track stage.Name) {\n <div class=\"stage-row\">\n <div class=\"stage-name\">{{ stage.Name }}</div>\n <div class=\"stage-track\">\n <div class=\"stage-fill\" [style.width.%]=\"stage.Percentage\" [style.background]=\"stage.Color\">\n @if (stage.Percentage > 15) {\n {{ stage.Time }}s\n }\n </div>\n </div>\n <div class=\"stage-time\">{{ stage.Time }}s</div>\n </div>\n }\n </div>\n <div class=\"stage-summary\">\n <span><strong>Total avg:</strong> {{ TotalAvgProcessingTime }}s per item</span>\n @if (BottleneckStage) {\n <span class=\"stage-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:var(--mj-status-warning);margin-right:4px\"></i>\n {{ BottleneckStage }} stage is the bottleneck ({{ BottleneckPercent }}% of total time)\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Success Rate -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Success Rate Overview</h3>\n <div class=\"widget-card\">\n <div class=\"success-rate-display\">\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-status-success)\">\n {{ rawProcessRuns.length > 0 ? (100 - (ErrorLog.length / rawProcessRuns.length * 100)).toFixed(1) : '100' }}%\n </div>\n <div class=\"success-rate-label\">Success Rate</div>\n </div>\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-status-error)\">\n {{ rawProcessRuns.length > 0 ? (ErrorLog.length / rawProcessRuns.length * 100).toFixed(1) : '0' }}%\n </div>\n <div class=\"success-rate-label\">Failure Rate</div>\n </div>\n <div class=\"success-rate-stat\">\n <div class=\"success-rate-value\" style=\"color:var(--mj-text-primary)\">\n {{ FormatNumber(rawProcessRuns.length) }}\n </div>\n <div class=\"success-rate-label\">Total Runs</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Active Runs Table -->\n @if (ActiveRuns.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-spinner\"></i> Active Runs</h3>\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Run ID</th>\n <th>Source</th>\n <th>Started</th>\n <th>Progress</th>\n <th>Stage</th>\n <th class=\"num\">Items</th>\n </tr>\n </thead>\n <tbody>\n @for (run of ActiveRuns; track run.RunID) {\n <tr>\n <td class=\"monospace-cell\">{{ run.RunID }}</td>\n <td>{{ run.Source }}</td>\n <td class=\"muted\">{{ run.Started }}</td>\n <td>\n <div class=\"progress-track\"><div class=\"progress-fill\" [style.width.%]=\"run.Progress\" style=\"background:var(--mj-brand-primary)\"></div></div>\n <span class=\"progress-text\">{{ run.Progress }}%</span>\n </td>\n <td><span class=\"badge\" [class]=\"run.StageClass\">{{ run.Stage }}</span></td>\n <td class=\"num\">{{ FormatNumber(run.Items) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Error Log -->\n @if (ErrorLog.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> Recent Errors</h3>\n <div class=\"error-log\">\n @for (entry of ErrorLog; track TrackByIndex($index)) {\n <div class=\"error-entry\">\n <div class=\"error-time\">{{ entry.Time }}</div>\n <div class=\"error-source\">{{ entry.Source }}</div>\n <div class=\"error-msg\">{{ entry.Message }}</div>\n </div>\n }\n </div>\n </div>\n }\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 5: QUALITY -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'quality') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <h1>Quality</h1>\n </div>\n\n <!-- Confidence Distribution Histogram -->\n <div class=\"sub-section\" style=\"margin-top:0\">\n <h3><i class=\"fa-solid fa-chart-column\"></i> Confidence Distribution</h3>\n <div class=\"widget-card\">\n <div class=\"histogram\">\n @for (bin of ConfidenceHistogram; track bin.Label) {\n <div class=\"hist-bar-col\" style=\"cursor:pointer\" (click)=\"OpenDrillDown('quality-bin:' + bin.Label)\">\n <div class=\"hist-bar\" [style.height.%]=\"bin.Percentage\" [style.background]=\"bin.Color\">\n @if (bin.Count > 0) { {{ bin.Count }} }\n </div>\n <div class=\"hist-label\">{{ bin.Label }}</div>\n </div>\n }\n </div>\n <div class=\"confidence-stats\">\n @for (stat of ConfidenceStats; track stat.Label) {\n <span><strong>{{ stat.Label }}:</strong> {{ stat.Value }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- D10: Quality bin drill-down -->\n @if (DrillDownTarget && DrillDownTarget.startsWith('quality-bin:')) {\n <div class=\"drill-down-panel\">\n <div class=\"drill-down-header\">\n <span class=\"drill-down-title\"><i class=\"fa-solid fa-table\"></i> Items in Confidence Range {{ DrillDownTarget.replace('quality-bin:', '') }}</span>\n <div class=\"drill-down-header-actions\">\n @if (DrillDownData.length > 0) {\n <button class=\"drill-export-btn\" (click)=\"ExportDrillDownCSV()\" title=\"Export CSV\"><i class=\"fa-solid fa-download\"></i> CSV</button>\n }\n <button class=\"drill-down-close\" aria-label=\"Close drill-down\" (click)=\"CloseDrillDown()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n </div>\n @if (IsDrillDownLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n } @else if (DrillDownData.length > 0) {\n <div class=\"drill-down-table-wrap\">\n <table class=\"data-table\">\n <thead><tr>\n @for (col of DrillDownColumns; track col) { <th>{{ col }}</th> }\n @if (DrillDownHasActions) { <th class=\"drill-action-col\"></th> }\n </tr></thead>\n <tbody>\n @for (row of DrillDownData; track TrackByIndex($index)) {\n <tr>\n @for (col of DrillDownColumns; track col) { <td>{{ row[col] }}</td> }\n @if (DrillDownHasActions) {\n <td class=\"drill-action-col\">\n @if (row['_RecordID']) {\n <button class=\"drill-open-btn\" aria-label=\"Open record\" (click)=\"OpenDrillDownRecord(row)\" title=\"Open record\"><i class=\"fa-solid fa-arrow-up-right-from-square\"></i></button>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"drill-down-empty\">No items in this confidence range</div>\n }\n </div>\n }\n\n <!-- Weight Distribution by Entity -->\n @if (WeightByEntity.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-weight-scale\"></i> Weight Distribution by Entity</h3>\n <div class=\"widget-card\">\n <div class=\"grouped-bar-chart\">\n @for (entity of WeightByEntity; track entity.Name) {\n <div class=\"grouped-col\">\n <div class=\"grouped-bars\">\n <div class=\"g-bar\" [style.height.%]=\"entity.High\" style=\"background:var(--mj-brand-primary)\" [title]=\"'High: ' + entity.High + '%'\"></div>\n <div class=\"g-bar\" [style.height.%]=\"entity.Med\" style=\"background:var(--mj-status-info)\" [title]=\"'Med: ' + entity.Med + '%'\"></div>\n <div class=\"g-bar\" [style.height.%]=\"entity.Low\" style=\"background:var(--mj-text-muted)\" [title]=\"'Low: ' + entity.Low + '%'\"></div>\n </div>\n <div class=\"grouped-label\">{{ entity.Name }}</div>\n </div>\n }\n </div>\n <div class=\"legend\" style=\"justify-content:center;margin-top:14px\">\n @for (item of WeightLegend; track item.Label) {\n <div class=\"legend-item\"><div class=\"legend-dot\" [style.background]=\"item.Color\"></div> {{ item.Label }}</div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Tag Accuracy Over Time -->\n @if (AccuracyLinePoints) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Tag Accuracy Over Time (Weekly Avg Confidence)</h3>\n <div class=\"widget-card\">\n <div class=\"accuracy-chart\">\n <div class=\"accuracy-y-labels\">\n <div>1.0</div>\n <div>0.75</div>\n <div>0.50</div>\n <div>0.25</div>\n </div>\n <div class=\"accuracy-area\">\n <div class=\"accuracy-grid-line\" style=\"top:33%\"></div>\n <div class=\"accuracy-grid-line\" style=\"top:66%\"></div>\n <svg width=\"100%\" height=\"110\" viewBox=\"0 0 400 110\" preserveAspectRatio=\"none\" class=\"accuracy-svg\">\n <polyline [attr.points]=\"AccuracyLinePoints\"\n fill=\"none\" stroke=\"var(--mj-brand-primary)\" stroke-width=\"2.5\" vector-effect=\"non-scaling-stroke\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n @for (dot of AccuracyDots; track TrackByIndex($index)) {\n <circle [attr.cx]=\"dot.Cx\" [attr.cy]=\"dot.Cy\" r=\"3\" fill=\"var(--mj-brand-primary)\"/>\n }\n </svg>\n </div>\n </div>\n <div class=\"accuracy-x-labels\">\n @for (label of AccuracyMonthLabels; track label) {\n <span>{{ label }}</span>\n }\n </div>\n <div class=\"accuracy-trend-text\">\n <i class=\"fa-solid fa-arrow-trend-up\" style=\"margin-right:4px\"></i>\n {{ AccuracyTrendText }}\n </div>\n </div>\n </div>\n }\n\n <!-- Low-Confidence Tags Table -->\n @if (LowConfidenceTags.length > 0) {\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-exclamation-triangle\"></i> Low-Confidence Tags (Avg Weight &lt; 0.4)</h3>\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Tag Name</th>\n <th class=\"num\">Avg Weight</th>\n <th class=\"num\">Usage Count</th>\n <th>Top Entity</th>\n <th>Suggested Action</th>\n </tr>\n </thead>\n <tbody>\n @for (tag of LowConfidenceTags; track tag.Name) {\n <tr>\n <td><strong>{{ tag.Name }}</strong></td>\n <td class=\"num\">{{ tag.AvgWeight }}</td>\n <td class=\"num\">{{ tag.UsageCount }}</td>\n <td>{{ tag.TopEntity }}</td>\n <td><span class=\"badge\" [class]=\"tag.ActionClass\">{{ tag.SuggestedAction }}</span></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Model Performance Comparison -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-robot\"></i> Model Performance Comparison</h3>\n <div class=\"model-grid\">\n @for (model of ModelComparisons; track model.Name) {\n <div class=\"model-card\">\n <div class=\"model-name\"><i [class]=\"model.Icon\" [style.color]=\"model.IconColor\" style=\"margin-right:4px\"></i> {{ model.Name }}</div>\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" style=\"margin:4px 0\">\n <circle cx=\"40\" cy=\"40\" r=\"32\" fill=\"none\" stroke=\"var(--mj-border-default)\" stroke-width=\"8\"/>\n <circle cx=\"40\" cy=\"40\" r=\"32\" fill=\"none\" [attr.stroke]=\"model.ScoreColor\" stroke-width=\"8\"\n [attr.stroke-dasharray]=\"model.StrokeDash\" stroke-dashoffset=\"50\"\n transform=\"rotate(-90 40 40)\" stroke-linecap=\"round\"/>\n </svg>\n <div class=\"model-score\" [style.color]=\"model.ScoreColor\">{{ model.ScorePercentage }}%</div>\n <div class=\"model-detail\">Avg confidence: {{ model.AvgConfidence }}</div>\n <div class=\"model-detail\">{{ FormatNumber(model.TagsGenerated) }} tags generated</div>\n <div class=\"model-detail\" [style.color]=\"model.RoleColor\" style=\"font-weight:600\">{{ model.Role }}</div>\n </div>\n }\n </div>\n @if (ModelRecommendation) {\n <div class=\"model-recommendation\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color:var(--mj-status-warning)\"></i>\n <div>\n <strong>Recommendation:</strong> {{ ModelRecommendation }}\n </div>\n </div>\n }\n </div>\n </section>\n }\n\n <!-- ====================================================== -->\n <!-- TAB 6: COST & USAGE (D1) -->\n <!-- ====================================================== -->\n @if (ActiveTab === 'cost') {\n <section class=\"tab-section\">\n <div class=\"tab-section-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h1>Cost & Usage</h1>\n <div class=\"tab-header-actions\">\n <button class=\"drill-export-btn\" (click)=\"ExportTabDataCSV('cost-usage')\" title=\"Export CSV\">\n <i class=\"fa-solid fa-download\"></i> CSV\n </button>\n <button class=\"drill-export-btn\" (click)=\"PrintCurrentTab()\" title=\"Print (PDF alternative)\">\n <i class=\"fa-solid fa-print\"></i> Print\n </button>\n </div>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"date-chips\">\n @for (range of DateRanges; track range.Label) {\n <button\n class=\"date-chip\"\n [class.active]=\"ActiveDateRange === range.Label\"\n (click)=\"SetDateRange(range.Label)\"\n >{{ range.Label }}</button>\n }\n </div>\n </div>\n\n <!-- KPI Cards -->\n @if (CostKPIs.length > 0) {\n <div class=\"cost-kpi-row\">\n @for (kpi of CostKPIs; track kpi.Label) {\n <div class=\"cost-kpi-card\">\n <div class=\"cost-kpi-icon\"><i [class]=\"kpi.Icon\"></i></div>\n <div>\n <div class=\"cost-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"cost-kpi-label\">{{ kpi.Label }}</div>\n <div class=\"cost-kpi-sub\">{{ kpi.SubLabel }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Per-Run Cost Table -->\n <div class=\"sub-section\">\n <h3><i class=\"fa-solid fa-table\"></i> Cost Breakdown by Run</h3>\n @if (CostPerRunRows.length > 0) {\n <div class=\"table-scroll\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Run ID</th>\n <th>Source</th>\n <th class=\"num\">Tokens</th>\n <th class=\"num\">Cost</th>\n <th>Started</th>\n </tr>\n </thead>\n <tbody>\n @for (row of CostPerRunRows; track row.RunID) {\n <tr>\n <td class=\"monospace-cell\">{{ row.RunID }}</td>\n <td>{{ row.Source }}</td>\n <td class=\"num\">{{ FormatNumber(row.Tokens) }}</td>\n <td class=\"num\">{{ row.Cost > 0 ? '$' + row.Cost.toFixed(4) : '$0.00' }}</td>\n <td class=\"muted\">{{ row.Started }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-coins\"></i>\n <p>No cost data available yet. Run the pipeline to generate cost and token usage metrics.</p>\n <p class=\"empty-state-hint\">Cost data is aggregated from ContentProcessRunDetail records linked to AI Prompt Runs.</p>\n </div>\n }\n </div>\n </section>\n }\n\n </div><!-- /main-content -->\n </div><!-- /analytics-layout -->\n}\n"]}