@memberjunction/ng-dashboards 5.21.0 → 5.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  5. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  9. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
  10. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  11. package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
  12. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  13. package/dist/AI/index.d.ts +3 -0
  14. package/dist/AI/index.d.ts.map +1 -1
  15. package/dist/AI/index.js +6 -0
  16. package/dist/AI/index.js.map +1 -1
  17. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  18. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  19. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  20. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  21. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  22. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  23. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  24. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  25. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  26. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  27. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  28. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  29. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  30. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  31. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  32. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  33. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  34. package/dist/Home/home-dashboard.component.d.ts +181 -1
  35. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  36. package/dist/Home/home-dashboard.component.js +1704 -182
  37. package/dist/Home/home-dashboard.component.js.map +1 -1
  38. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
  39. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  40. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
  41. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  42. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  43. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  44. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  45. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  46. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  47. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  48. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  49. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  50. package/dist/KnowledgeHub/index.d.ts +4 -0
  51. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  52. package/dist/KnowledgeHub/index.js +5 -0
  53. package/dist/KnowledgeHub/index.js.map +1 -0
  54. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  55. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  56. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  57. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  58. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  59. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  60. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  61. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  62. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  63. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  64. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  65. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  66. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  67. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  68. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  69. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  70. package/dist/Testing/components/testing-explorer.component.js +241 -200
  71. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  72. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  73. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  74. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  75. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  76. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  77. package/dist/Testing/components/testing-runs.component.js +7 -5
  78. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  79. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  80. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  81. package/dist/Testing/testing-dashboard.component.js +128 -59
  82. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  83. package/dist/ai-dashboards.module.d.ts +26 -19
  84. package/dist/ai-dashboards.module.d.ts.map +1 -1
  85. package/dist/ai-dashboards.module.js +40 -5
  86. package/dist/ai-dashboards.module.js.map +1 -1
  87. package/dist/core-dashboards.module.d.ts +1 -0
  88. package/dist/core-dashboards.module.d.ts.map +1 -1
  89. package/dist/core-dashboards.module.js +3 -0
  90. package/dist/core-dashboards.module.js.map +1 -1
  91. package/dist/public-api.d.ts +4 -1
  92. package/dist/public-api.d.ts.map +1 -1
  93. package/dist/public-api.js +5 -1
  94. package/dist/public-api.js.map +1 -1
  95. package/dist/testing-dashboards.module.d.ts +5 -4
  96. package/dist/testing-dashboards.module.d.ts.map +1 -1
  97. package/dist/testing-dashboards.module.js +4 -0
  98. package/dist/testing-dashboards.module.js.map +1 -1
  99. package/package.json +44 -42
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autotagging-pipeline-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.ts","../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Content Autotagging Pipeline Monitor\n *\n * Operations dashboard for monitoring the content autotagging pipeline.\n * Displays KPI metrics, pipeline stage visualization, recent processing feed,\n * and source configuration status.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/** Represents a single pipeline stage with its current status */\ninterface PipelineStage {\n Name: string;\n Icon: string;\n ActiveCount: number;\n Status: 'idle' | 'active' | 'error';\n}\n\n/** Summary of a recently processed content item */\ninterface ProcessedItem {\n Name: string;\n SourceName: string;\n ProcessingTimeMs: number;\n Status: 'Complete' | 'Error' | 'Processing';\n TagCount: number;\n ProcessedAt: Date;\n}\n\n/** Summary of a configured content source */\ninterface ContentSource {\n ID: string;\n Name: string;\n TypeName: string;\n TypeIcon: string;\n Status: 'Active' | 'Paused' | 'Error';\n LastRunAt: Date | null;\n ItemCount: number;\n}\n\n/** KPI metric card data */\ninterface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n ColorClass: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'AutotaggingPipelineResource')\n@Component({\n standalone: false,\n selector: 'app-autotagging-pipeline-resource',\n templateUrl: './autotagging-pipeline-resource.component.html',\n styleUrls: ['./autotagging-pipeline-resource.component.css']\n})\nexport class AutotaggingPipelineResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n public ErrorMessage = '';\n\n // KPI data\n public KPIMetrics: KPIMetric[] = [];\n\n // Pipeline stages\n public PipelineStages: PipelineStage[] = [];\n\n // Recent processing feed\n public ProcessedItems: ProcessedItem[] = [];\n\n // Source configuration\n public ContentSources: ContentSource[] = [];\n\n // Raw data holders for aggregation\n private contentItems: Record<string, unknown>[] = [];\n private contentRuns: Record<string, unknown>[] = [];\n private contentTags: Record<string, unknown>[] = [];\n private contentSourceTypes: Record<string, unknown>[] = [];\n private contentSourcesRaw: Record<string, unknown>[] = [];\n\n private cdr = inject(ChangeDetectorRef);\n\n async ngAfterViewInit(): Promise<void> {\n await this.LoadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Content Autotagging';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n\n /** Load all pipeline data from MJ entities */\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = '';\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const [sourcesResult, itemsResult, runsResult, tagsResult, typesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Content Sources',\n OrderBy: 'Name',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Items',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Process Runs',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Item Tags',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Content Source Types',\n ResultType: 'simple'\n }\n ]);\n\n this.contentSourcesRaw = sourcesResult.Success ? sourcesResult.Results : [];\n this.contentItems = itemsResult.Success ? itemsResult.Results : [];\n this.contentRuns = runsResult.Success ? runsResult.Results : [];\n this.contentTags = tagsResult.Success ? tagsResult.Results : [];\n this.contentSourceTypes = typesResult.Success ? typesResult.Results : [];\n\n this.buildKPIMetrics();\n this.buildPipelineStages();\n this.buildProcessedItems();\n this.buildContentSources();\n } catch (error) {\n console.error('Error loading autotagging pipeline data:', error);\n this.ErrorMessage = 'Failed to load pipeline data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Refresh pipeline status data */\n public async RefreshData(): Promise<void> {\n await this.LoadData();\n }\n\n /** Format milliseconds into a human-readable duration */\n public FormatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n }\n\n /** Format a date as a relative time string */\n public FormatRelativeTime(date: Date | null): string {\n if (!date) return 'Never';\n const now = new Date();\n const diffMs = now.getTime() - new Date(date).getTime();\n const diffMins = Math.floor(diffMs / 60000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n }\n\n /** Get CSS class for a processing status */\n public GetStatusClass(status: string): string {\n switch (status) {\n case 'Complete':\n case 'Active':\n return 'status-success';\n case 'Processing':\n return 'status-processing';\n case 'Error':\n return 'status-error';\n case 'Paused':\n return 'status-warning';\n default:\n return 'status-default';\n }\n }\n\n /** Get icon for a source type */\n public GetSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug',\n 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt',\n 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n }\n\n // ---- Private Methods ----\n\n /** Build KPI metrics from loaded data */\n private buildKPIMetrics(): void {\n const activeSources = this.contentSourcesRaw.filter(\n (s: Record<string, unknown>) => s['Status'] === 'Active'\n ).length;\n\n const totalItems = this.contentItems.length;\n const totalTags = this.contentTags.length;\n const errorCount = this.contentRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Error'\n ).length;\n\n this.KPIMetrics = [\n {\n Label: 'Active Sources',\n Value: activeSources,\n Icon: 'fa-solid fa-satellite-dish',\n ColorClass: 'kpi-brand'\n },\n {\n Label: 'Items Processed',\n Value: totalItems,\n Icon: 'fa-solid fa-file-lines',\n ColorClass: 'kpi-info'\n },\n {\n Label: 'Tags Generated',\n Value: totalTags,\n Icon: 'fa-solid fa-tags',\n ColorClass: 'kpi-success'\n },\n {\n Label: 'Errors',\n Value: errorCount,\n Icon: 'fa-solid fa-circle-exclamation',\n ColorClass: errorCount > 0 ? 'kpi-error' : 'kpi-success'\n }\n ];\n }\n\n /** Build pipeline stage visualization data */\n private buildPipelineStages(): void {\n const runsByStage = this.groupRunsByStage();\n\n this.PipelineStages = [\n this.createStage('Ingest', 'fa-solid fa-download', runsByStage),\n this.createStage('Extract', 'fa-solid fa-file-export', runsByStage),\n this.createStage('Chunk', 'fa-solid fa-puzzle-piece', runsByStage),\n this.createStage('Tag', 'fa-solid fa-tag', runsByStage),\n this.createStage('Vectorize', 'fa-solid fa-vector-square', runsByStage)\n ];\n }\n\n /** Group content runs by their processing stage */\n private groupRunsByStage(): Map<string, Record<string, unknown>[]> {\n const groups = new Map<string, Record<string, unknown>[]>();\n for (const run of this.contentRuns) {\n const stage = (run['Stage'] as string) ?? 'Unknown';\n const existing = groups.get(stage) ?? [];\n existing.push(run);\n groups.set(stage, existing);\n }\n return groups;\n }\n\n /** Create a pipeline stage object from run data */\n private createStage(\n name: string,\n icon: string,\n runsByStage: Map<string, Record<string, unknown>[]>\n ): PipelineStage {\n const stageRuns = runsByStage.get(name) ?? [];\n const activeRuns = stageRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Processing' || r['Status'] === 'Running'\n );\n const errorRuns = stageRuns.filter(\n (r: Record<string, unknown>) => r['Status'] === 'Error'\n );\n\n let status: 'idle' | 'active' | 'error' = 'idle';\n if (errorRuns.length > 0) status = 'error';\n else if (activeRuns.length > 0) status = 'active';\n\n return { Name: name, Icon: icon, ActiveCount: activeRuns.length, Status: status };\n }\n\n /** Build the recent processing feed from content items and tags */\n private buildProcessedItems(): void {\n const tagCountByItem = this.countTagsByItem();\n\n this.ProcessedItems = this.contentItems.slice(0, 50).map((item: Record<string, unknown>) => {\n const itemId = item['ID'] as string;\n return {\n Name: (item['Name'] as string) ?? 'Unnamed Item',\n SourceName: (item['ContentSource'] as string) ?? (item['ContentSourceID'] as string) ?? 'Unknown',\n ProcessingTimeMs: (item['ProcessingTimeMs'] as number) ?? 0,\n Status: this.mapItemStatus(item['Status'] as string),\n TagCount: tagCountByItem.get(itemId) ?? 0,\n ProcessedAt: item['__mj_CreatedAt'] ? new Date(item['__mj_CreatedAt'] as string) : new Date()\n };\n });\n }\n\n /** Count tags per content item */\n private countTagsByItem(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const tag of this.contentTags) {\n const itemId = tag['ContentItemID'] as string;\n if (itemId) {\n counts.set(itemId, (counts.get(itemId) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /** Map raw status values to display status */\n private mapItemStatus(status: string | undefined): 'Complete' | 'Error' | 'Processing' {\n if (!status) return 'Processing';\n const normalized = status.toLowerCase();\n if (normalized === 'complete' || normalized === 'completed' || normalized === 'done') return 'Complete';\n if (normalized === 'error' || normalized === 'failed') return 'Error';\n return 'Processing';\n }\n\n /** Build content source summaries from raw data */\n private buildContentSources(): void {\n const typeMap = this.buildTypeMap();\n const itemCountBySource = this.countItemsBySource();\n\n this.ContentSources = this.contentSourcesRaw.map((source: Record<string, unknown>) => {\n const typeId = source['ContentSourceTypeID'] as string;\n const typeName = typeMap.get(typeId) ?? 'Unknown';\n\n return {\n ID: source['ID'] as string,\n Name: (source['Name'] as string) ?? 'Unnamed Source',\n TypeName: typeName,\n TypeIcon: this.GetSourceTypeIcon(typeName),\n Status: this.mapSourceStatus(source['Status'] as string),\n LastRunAt: source['LastRunAt'] ? new Date(source['LastRunAt'] as string) : null,\n ItemCount: itemCountBySource.get(source['ID'] as string) ?? 0\n };\n });\n }\n\n /** Build a map of source type IDs to names */\n private buildTypeMap(): Map<string, string> {\n const map = new Map<string, string>();\n for (const type of this.contentSourceTypes) {\n map.set(type['ID'] as string, (type['Name'] as string) ?? 'Unknown');\n }\n return map;\n }\n\n /** Count content items per source */\n private countItemsBySource(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.contentItems) {\n const sourceId = item['ContentSourceID'] as string;\n if (sourceId) {\n counts.set(sourceId, (counts.get(sourceId) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /** Map raw source status to display status */\n private mapSourceStatus(status: string | undefined): 'Active' | 'Paused' | 'Error' {\n if (!status) return 'Paused';\n const normalized = status.toLowerCase();\n if (normalized === 'active' || normalized === 'running') return 'Active';\n if (normalized === 'error' || normalized === 'failed') return 'Error';\n return 'Paused';\n }\n}\n\nexport function LoadAutotaggingPipelineResource(): void {\n // Prevents tree-shaking\n}\n","<!-- Content Autotagging Pipeline Monitor -->\n<div class=\"autotagging-container\">\n @if (IsLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading pipeline data...\"></mj-loading>\n </div>\n }\n\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n <button class=\"refresh-btn\" (click)=\"RefreshData()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Retry\n </button>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"header-row\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags header-icon\"></i>\n <h2>Content Autotagging Pipeline</h2>\n </div>\n <button class=\"refresh-btn\" (click)=\"RefreshData()\">\n <i class=\"fa-solid fa-rotate-right\"></i> Refresh\n </button>\n </div>\n\n <!-- KPI Strip -->\n <div class=\"kpi-strip\">\n @for (metric of KPIMetrics; track metric.Label) {\n <div class=\"kpi-card\" [class]=\"metric.ColorClass\">\n <div class=\"kpi-icon\">\n <i [class]=\"metric.Icon\"></i>\n </div>\n <div class=\"kpi-content\">\n <span class=\"kpi-value\">{{ metric.Value | number }}</span>\n <span class=\"kpi-label\">{{ metric.Label }}</span>\n </div>\n </div>\n }\n </div>\n\n <!-- Pipeline Stages Visualization -->\n <div class=\"pipeline-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-diagram-project\"></i> Pipeline Stages\n </h3>\n <div class=\"pipeline-flow\">\n @for (stage of PipelineStages; track stage.Name; let last = $last) {\n <div class=\"pipeline-stage\" [class]=\"'stage-' + stage.Status\">\n <div class=\"stage-icon\">\n <i [class]=\"stage.Icon\"></i>\n </div>\n <span class=\"stage-name\">{{ stage.Name }}</span>\n <span class=\"stage-count\">\n @if (stage.ActiveCount > 0) {\n {{ stage.ActiveCount }} active\n } @else {\n Idle\n }\n </span>\n <div class=\"stage-indicator\"></div>\n </div>\n @if (!last) {\n <div class=\"stage-connector\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Main content area: Feed + Sources sidebar -->\n <div class=\"main-content\">\n <!-- Recent Processing Feed -->\n <div class=\"feed-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> Recent Processing\n </h3>\n <div class=\"feed-list\">\n @if (ProcessedItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No processed items yet.</p>\n </div>\n }\n @for (item of ProcessedItems; track $index) {\n <div class=\"feed-item\">\n <div class=\"feed-item-header\">\n <span class=\"feed-item-name\" [title]=\"item.Name\">{{ item.Name }}</span>\n <span class=\"feed-item-status\" [class]=\"GetStatusClass(item.Status)\">\n {{ item.Status }}\n </span>\n </div>\n <div class=\"feed-item-details\">\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-database\"></i> {{ item.SourceName }}\n </span>\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-stopwatch\"></i> {{ FormatDuration(item.ProcessingTimeMs) }}\n </span>\n <span class=\"feed-detail\">\n <i class=\"fa-solid fa-tags\"></i> {{ item.TagCount }} tags\n </span>\n <span class=\"feed-detail feed-time\">\n {{ FormatRelativeTime(item.ProcessedAt) }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Source Configuration Panel (right sidebar) -->\n <div class=\"sources-panel\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-gear\"></i> Content Sources\n </h3>\n <div class=\"sources-list\">\n @if (ContentSources.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug-circle-xmark\"></i>\n <p>No sources configured.</p>\n </div>\n }\n @for (source of ContentSources; track source.ID) {\n <div class=\"source-card\">\n <div class=\"source-header\">\n <div class=\"source-icon\">\n <i [class]=\"source.TypeIcon\"></i>\n </div>\n <div class=\"source-info\">\n <span class=\"source-name\">{{ source.Name }}</span>\n <span class=\"source-type\">{{ source.TypeName }}</span>\n </div>\n <span class=\"source-status\" [class]=\"GetStatusClass(source.Status)\">\n {{ source.Status }}\n </span>\n </div>\n <div class=\"source-meta\">\n <span class=\"source-meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ FormatRelativeTime(source.LastRunAt) }}\n </span>\n <span class=\"source-meta-item\">\n <i class=\"fa-solid fa-file-lines\"></i>\n {{ source.ItemCount | number }} items\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n"]}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @fileoverview Duplicate Detection Kanban Board Resource Component
3
+ *
4
+ * Dashboard resource for reviewing duplicate detection results in a Kanban-style
5
+ * board with three columns: Pending Review, Approved, and Rejected.
6
+ * Loads data from MJ: Duplicate Runs, MJ: Duplicate Run Details, and
7
+ * MJ: Duplicate Run Detail Matches entities.
8
+ */
9
+ import { OnDestroy, AfterViewInit } from '@angular/core';
10
+ import { ResourceData, MJDuplicateRunEntity, MJDuplicateRunDetailEntity, MJDuplicateRunDetailMatchEntity } from '@memberjunction/core-entities';
11
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
+ import * as i0 from "@angular/core";
13
+ /**
14
+ * Represents a group of duplicate matches for a single source record,
15
+ * aggregated from detail and match entities for display on the Kanban board.
16
+ */
17
+ interface DuplicateGroup {
18
+ DetailId: string;
19
+ RunId: string;
20
+ RecordId: string;
21
+ EntityName: string;
22
+ ApprovalStatus: 'Pending' | 'Approved' | 'Rejected';
23
+ MatchCount: number;
24
+ HighestScore: number;
25
+ Matches: MJDuplicateRunDetailMatchEntity[];
26
+ MatchedAt: Date;
27
+ }
28
+ interface DuplicateFilter {
29
+ EntityName: string;
30
+ MinScore: number;
31
+ MaxScore: number;
32
+ DateFrom: string;
33
+ DateTo: string;
34
+ }
35
+ export declare class DuplicateDetectionResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {
36
+ private cdr;
37
+ private destroy$;
38
+ private filterSubject;
39
+ IsLoading: boolean;
40
+ IsSaving: boolean;
41
+ Runs: MJDuplicateRunEntity[];
42
+ Details: MJDuplicateRunDetailEntity[];
43
+ Matches: MJDuplicateRunDetailMatchEntity[];
44
+ AllGroups: DuplicateGroup[];
45
+ PendingGroups: DuplicateGroup[];
46
+ ApprovedGroups: DuplicateGroup[];
47
+ RejectedGroups: DuplicateGroup[];
48
+ Filters: DuplicateFilter;
49
+ EntityNames: string[];
50
+ /** Whether this component is embedded inside the Knowledge Hub shell */
51
+ EmbeddedMode: boolean;
52
+ /** View mode: 'kanban' (card board) or 'table' (paged grid) */
53
+ DisplayMode: 'kanban' | 'table';
54
+ /** Page size for table view */
55
+ PageSize: number;
56
+ /** Current page (0-based) */
57
+ CurrentPage: number;
58
+ /** Selected entity filter */
59
+ SelectedEntityFilter: string;
60
+ /** Currently selected group for merge panel */
61
+ SelectedMergeGroup: DuplicateGroup | null;
62
+ /** Whether the merge panel is visible */
63
+ ShowMergePanel: boolean;
64
+ /** Auto-switch to table mode when groups exceed threshold */
65
+ private readonly kanbanThreshold;
66
+ /** Toggle display mode */
67
+ ToggleDisplayMode(): void;
68
+ /** Filter by entity name */
69
+ FilterByEntity(entityName: string): void;
70
+ /** Get paged groups for table view */
71
+ GetPagedGroups(): DuplicateGroup[];
72
+ /** Get total page count */
73
+ get TotalPages(): number;
74
+ /** Navigate to next page */
75
+ NextPage(): void;
76
+ /** Navigate to previous page */
77
+ PrevPage(): void;
78
+ /** Open the merge panel for a duplicate group */
79
+ OpenMergePanel(group: DuplicateGroup): void;
80
+ /** Close the merge panel */
81
+ CloseMergePanel(): void;
82
+ /** Auto-select display mode based on group count */
83
+ private autoSelectDisplayMode;
84
+ get TotalGroupCount(): number;
85
+ get PendingCount(): number;
86
+ get ApprovedCount(): number;
87
+ get RejectedCount(): number;
88
+ ngAfterViewInit(): Promise<void>;
89
+ ngOnDestroy(): void;
90
+ GetResourceDisplayName(_data: ResourceData): Promise<string>;
91
+ GetResourceIconClass(_data: ResourceData): Promise<string>;
92
+ /**
93
+ * Loads all duplicate run data and builds the Kanban groups.
94
+ */
95
+ LoadData(): Promise<void>;
96
+ /**
97
+ * Approves all matches within a duplicate group by updating each match's ApprovalStatus.
98
+ */
99
+ ApproveMatch(group: DuplicateGroup): Promise<void>;
100
+ /**
101
+ * Rejects all matches within a duplicate group by updating each match's ApprovalStatus.
102
+ */
103
+ RejectMatch(group: DuplicateGroup): Promise<void>;
104
+ /** Handle filter changes with debounce */
105
+ OnFilterChange(): void;
106
+ /** Clear all filters */
107
+ ClearFilters(): void;
108
+ /** Returns the CSS class for a match score indicator */
109
+ GetScoreClass(score: number): string;
110
+ /** Returns a human-readable label for a match score */
111
+ GetScoreLabel(score: number): string;
112
+ /** Format a date for display */
113
+ FormatDate(date: Date | null): string;
114
+ /** Whether any filters are active */
115
+ get HasActiveFilters(): boolean;
116
+ private setupFilterDebounce;
117
+ /** Extract unique entity names from loaded runs */
118
+ private extractEntityNames;
119
+ /**
120
+ * Build DuplicateGroup objects by joining details to their matches,
121
+ * and resolving the entity name from the parent run.
122
+ */
123
+ private buildGroups;
124
+ /** Find the highest match probability across a set of matches */
125
+ private computeHighestScore;
126
+ /**
127
+ * Determine the dominant approval status for a group of matches.
128
+ * If any match is Pending, the group is Pending.
129
+ * Otherwise, if all are Approved, the group is Approved.
130
+ * If all are Rejected, the group is Rejected.
131
+ * Mixed Approved/Rejected defaults to Pending.
132
+ */
133
+ private computeDominantApprovalStatus;
134
+ /** Find the latest MatchedAt date across a set of matches */
135
+ private computeLatestMatchDate;
136
+ /** Apply filters and distribute groups into Kanban columns */
137
+ private applyFilters;
138
+ /** Update the ApprovalStatus of all matches within a group and re-sort.
139
+ * Since this.Matches already contains entity_object instances, we update and save them directly
140
+ * instead of loading each one individually from the database.
141
+ */
142
+ private updateGroupApprovalStatus;
143
+ static ɵfac: i0.ɵɵFactoryDeclaration<DuplicateDetectionResourceComponent, never>;
144
+ static ɵcmp: i0.ɵɵComponentDeclaration<DuplicateDetectionResourceComponent, "app-duplicate-detection-resource", never, { "EmbeddedMode": { "alias": "EmbeddedMode"; "required": false; }; }, {}, never, never, false, never>;
145
+ }
146
+ export declare function LoadDuplicateDetectionResource(): void;
147
+ export {};
148
+ //# sourceMappingURL=duplicate-detection-resource.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-detection-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/duplicate-detection-resource.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAgC,SAAS,EAAE,aAAa,EAAiB,MAAM,eAAe,CAAC;AAItG,OAAO,EACH,YAAY,EACZ,oBAAoB,EACpB,0BAA0B,EAC1B,+BAA+B,EAClC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAElE;;;GAGG;AACH,UAAU,cAAc;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,+BAA+B,EAAE,CAAC;IAC3C,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,UAAU,eAAe;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,qBAOa,mCAAoC,SAAQ,qBAAsB,YAAW,aAAa,EAAE,SAAS;IAC9G,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAuB;IAGrC,SAAS,UAAS;IAClB,QAAQ,UAAS;IAGjB,IAAI,EAAE,oBAAoB,EAAE,CAAM;IAClC,OAAO,EAAE,0BAA0B,EAAE,CAAM;IAC3C,OAAO,EAAE,+BAA+B,EAAE,CAAM;IAGhD,SAAS,EAAE,cAAc,EAAE,CAAM;IACjC,aAAa,EAAE,cAAc,EAAE,CAAM;IACrC,cAAc,EAAE,cAAc,EAAE,CAAM;IACtC,cAAc,EAAE,cAAc,EAAE,CAAM;IAGtC,OAAO,EAAE,eAAe,CAM7B;IAGK,WAAW,EAAE,MAAM,EAAE,CAAM;IAElC,wEAAwE;IAC/D,YAAY,UAAS;IAE9B,+DAA+D;IACxD,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAY;IAElD,+BAA+B;IACxB,QAAQ,SAAM;IAErB,6BAA6B;IACtB,WAAW,SAAK;IAEvB,6BAA6B;IACtB,oBAAoB,SAAM;IAEjC,+CAA+C;IACxC,kBAAkB,EAAE,cAAc,GAAG,IAAI,CAAQ;IAExD,yCAAyC;IAClC,cAAc,UAAS;IAE9B,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAM;IAEtC,0BAA0B;IACnB,iBAAiB,IAAI,IAAI;IAMhC,4BAA4B;IACrB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAO/C,sCAAsC;IAC/B,cAAc,IAAI,cAAc,EAAE;IAKzC,2BAA2B;IAC3B,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,4BAA4B;IACrB,QAAQ,IAAI,IAAI;IAOvB,gCAAgC;IACzB,QAAQ,IAAI,IAAI;IAOvB,iDAAiD;IAC1C,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMlD,4BAA4B;IACrB,eAAe,IAAI,IAAI;IAM9B,oDAAoD;IACpD,OAAO,CAAC,qBAAqB;IAK7B,IAAW,eAAe,IAAI,MAAM,CAEnC;IACD,IAAW,YAAY,IAAI,MAAM,CAEhC;IACD,IAAW,aAAa,IAAI,MAAM,CAEjC;IACD,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEK,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC,WAAW,IAAI,IAAI;IAKb,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhE;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CtC;;OAEG;IACU,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D;;OAEG;IACU,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,0CAA0C;IACnC,cAAc,IAAI,IAAI;IAI7B,wBAAwB;IACjB,YAAY,IAAI,IAAI;IAW3B,wDAAwD;IACjD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM3C,uDAAuD;IAChD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM3C,gCAAgC;IACzB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM;IAM5C,qCAAqC;IACrC,IAAW,gBAAgB,IAAI,OAAO,CAMrC;IAID,OAAO,CAAC,mBAAmB;IAS3B,mDAAmD;IACnD,OAAO,CAAC,kBAAkB;IAU1B;;;OAGG;IACH,OAAO,CAAC,WAAW;IA4CnB,iEAAiE;IACjE,OAAO,CAAC,mBAAmB;IAU3B;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAarC,6DAA6D;IAC7D,OAAO,CAAC,sBAAsB;IAW9B,8DAA8D;IAC9D,OAAO,CAAC,YAAY;IA+BpB;;;OAGG;YACW,yBAAyB;yCA1Z9B,mCAAmC;2CAAnC,mCAAmC;CAib/C;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}