@memberjunction/ng-dashboards 5.26.0 → 5.27.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.
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +96 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +710 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +52 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +356 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +52 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +306 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +81 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +744 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +61 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +490 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +77 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +673 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +65 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +537 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +131 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +1030 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +78 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +569 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -14
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts +58 -0
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts.map +1 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js +315 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/index.d.ts +11 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +13 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts +50 -0
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts.map +1 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js +9 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js.map +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/MCP/index.d.ts +1 -0
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +2 -0
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +5 -4
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +6 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +7 -8
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +27 -17
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +66 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -48
- package/dist/__tests__/analytics-resource.test.d.ts +0 -2
- package/dist/__tests__/analytics-resource.test.d.ts.map +0 -1
- package/dist/__tests__/analytics-resource.test.js +0 -181
- package/dist/__tests__/analytics-resource.test.js.map +0 -1
- package/dist/__tests__/dashboards.test.d.ts +0 -2
- package/dist/__tests__/dashboards.test.d.ts.map +0 -1
- package/dist/__tests__/dashboards.test.js +0 -40
- package/dist/__tests__/dashboards.test.js.map +0 -1
- package/dist/__tests__/integration-data-service.test.d.ts +0 -2
- package/dist/__tests__/integration-data-service.test.d.ts.map +0 -1
- package/dist/__tests__/integration-data-service.test.js +0 -132
- package/dist/__tests__/integration-data-service.test.js.map +0 -1
- package/dist/__tests__/mapping-validation.test.d.ts +0 -2
- package/dist/__tests__/mapping-validation.test.d.ts.map +0 -1
- package/dist/__tests__/mapping-validation.test.js +0 -170
- package/dist/__tests__/mapping-validation.test.js.map +0 -1
- package/dist/__tests__/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling.test.js +0 -205
- package/dist/__tests__/scheduling.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Prompt Run Analysis — Charts-first analytics with a detail table.\n *\n * Displays stats summary, runs-over-time chart, model/prompt/status breakdowns,\n * and a sortable, paginated detail table. All data is loaded via RunView from\n * the \"MJ: AI Prompt Runs\" entity.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n Cost: number | null;\n TotalCost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n PromptID: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunStats {\n TotalRuns: number;\n AvgCost: number;\n AvgTokens: number;\n AvgLatencySeconds: number;\n SuccessRate: number;\n P95LatencySeconds: number;\n TotalCost: number;\n}\n\ninterface ChartBucket {\n label: string;\n value: number;\n heightPercent: number;\n startTime: Date;\n endTime: Date;\n}\n\ninterface BreakdownItem {\n name: string;\n id: string;\n count: number;\n percentage: number;\n}\n\ninterface StatusBreakdownItem extends BreakdownItem {\n cssClass: string;\n}\n\ntype ChartMetric = 'volume' | 'cost' | 'tokens';\ntype SortField = 'RunAt' | 'Prompt' | 'Model' | 'Status' | 'ExecutionTimeMS' | 'TokensUsed' | 'Cost';\ntype SortDirection = 'asc' | 'desc';\n\nconst FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Status', 'Success', 'Cost', 'TotalCost',\n 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'PromptID', 'Prompt', 'ErrorMessage'\n];\n\nconst PAGE_SIZE = 25;\n\n@Component({\n standalone: false,\n selector: 'app-analytics-prompt-runs',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"Filters\"\n [ShowExportButton]=\"true\"\n [ShowCompareToggle]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n (ExportClicked)=\"ExportCSV()\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading prompt runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Summary Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCost, 4) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Tokens</div>\n <div class=\"stat-value\">{{ Stats.AvgTokens | number:'1.0-0' }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Latency</div>\n <div class=\"stat-value\">{{ Stats.AvgLatencySeconds | number:'1.2-2' }}s</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card accent-warning\">\n <div class=\"stat-label\">P95 Latency</div>\n <div class=\"stat-value\">{{ Stats.P95LatencySeconds | number:'1.2-2' }}s</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost, 2) }}</div>\n </div>\n </div>\n\n <!-- Chart Panel -->\n <div class=\"chart-panel\">\n <div class=\"chart-header\">\n <h3 class=\"chart-title\">Runs Over Time</h3>\n <div class=\"chart-toggles\">\n @for (metric of ChartMetricOptions; track metric.key) {\n <button\n class=\"toggle-chip\"\n [class.active]=\"ActiveChartMetric === metric.key\"\n (click)=\"OnChartMetricChange(metric.key)\">\n {{ metric.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"chart-area\">\n @if (ChartBuckets.length === 0) {\n <div class=\"chart-empty\">No data for selected time range</div>\n } @else {\n <div class=\"chart-bars\">\n @for (bucket of ChartBuckets; track bucket.label) {\n <div\n class=\"chart-bar-wrapper\"\n [title]=\"bucket.label + ': ' + bucket.value\"\n (click)=\"OnChartBucketClick(bucket)\">\n <div class=\"chart-bar-value\">{{ FormatChartValue(bucket.value) }}</div>\n <div class=\"chart-bar\" [style.height.%]=\"bucket.heightPercent\"></div>\n <div class=\"chart-bar-label\">{{ bucket.label }}</div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Breakdown Cards -->\n <div class=\"breakdown-grid\">\n <!-- By Model -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Model</h4>\n @for (item of ModelBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyModelFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (ModelBreakdown.length === 0) {\n <div class=\"breakdown-empty\">No data</div>\n }\n </div>\n\n <!-- By Prompt -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Prompt</h4>\n @for (item of PromptBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyPromptFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (PromptBreakdown.length === 0) {\n <div class=\"breakdown-empty\">No data</div>\n }\n </div>\n\n <!-- By Status -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Status</h4>\n @for (item of StatusBreakdown; track item.name) {\n <div class=\"breakdown-row\" (click)=\"ApplyStatusFilter(item.name)\">\n <span class=\"status-dot\" [class]=\"item.cssClass\"></span>\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }} ({{ item.percentage | number:'1.1-1' }}%)</span>\n </div>\n }\n @if (StatusBreakdown.length === 0) {\n <div class=\"breakdown-empty\">No data</div>\n }\n </div>\n </div>\n\n <!-- Run Details Table -->\n <div class=\"table-panel\">\n <div class=\"table-header\">\n <h3 class=\"table-title\">Run Details</h3>\n <span class=\"table-count\">{{ FilteredRuns.length | number }} runs</span>\n </div>\n <div class=\"table-scroll\">\n <table class=\"runs-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n [class.sortable]=\"col.sortable\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"col.sortable ? OnSortChange(col.field) : null\">\n {{ col.label }}\n @if (col.sortable && SortField === col.field) {\n <i [class]=\"SortDirection === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (run of PagedRuns; track run.ID; let i = $index) {\n <tr [class.row-even]=\"i % 2 === 0\">\n <td class=\"cell-timestamp\">{{ FormatTimestamp(run.RunAt) }}</td>\n <td class=\"cell-prompt\">{{ run.Prompt ?? '(unnamed)' }}</td>\n <td><span class=\"model-tag\">{{ run.Model ?? 'N/A' }}</span></td>\n <td><span class=\"status-pill\" [class]=\"GetStatusClass(run.Status)\">{{ run.Status }}</span></td>\n <td class=\"cell-number\">{{ FormatDuration(run.ExecutionTimeMS) }}</td>\n <td class=\"cell-number\">{{ run.TokensUsed != null ? (run.TokensUsed | number) : '-' }}</td>\n <td class=\"cell-number\">{{ FormatCurrency(run.Cost, 4) }}</td>\n </tr>\n }\n @if (PagedRuns.length === 0) {\n <tr>\n <td colspan=\"7\" class=\"empty-row\">No prompt runs found for the selected filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n @if (TotalPages > 1) {\n <div class=\"pagination\">\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"OnPageChange(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <span class=\"page-info\">Page {{ CurrentPage }} of {{ TotalPages }}</span>\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"OnPageChange(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* ── Stats Grid ── */\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-top: 16px;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .stat-card.accent-brand {\n border-left: 3px solid var(--mj-brand-primary);\n }\n\n .stat-card.accent-success {\n border-left: 3px solid var(--mj-status-success);\n }\n\n .stat-card.accent-warning {\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .stat-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n\n .stat-value {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* ── Chart Panel ── */\n\n .chart-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n }\n\n .chart-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .chart-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .chart-toggles {\n display: flex;\n gap: 4px;\n }\n\n .toggle-chip {\n padding: 4px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n }\n\n .toggle-chip:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .toggle-chip.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .chart-area {\n height: 220px;\n display: flex;\n align-items: flex-end;\n }\n\n .chart-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .chart-bars {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n width: 100%;\n height: 100%;\n padding-bottom: 24px;\n }\n\n .chart-bar-wrapper {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n position: relative;\n height: 100%;\n justify-content: flex-end;\n }\n\n .chart-bar-value {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .chart-bar {\n width: 80%;\n min-height: 2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 4px 4px 0 0;\n transition: background 0.15s, height 0.3s;\n }\n\n .chart-bar-wrapper:hover .chart-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n }\n\n .chart-bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n position: absolute;\n bottom: 0;\n }\n\n /* ── Breakdown Cards ── */\n\n .breakdown-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-top: 16px;\n }\n\n .breakdown-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n }\n\n .breakdown-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n }\n\n .breakdown-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.1s;\n }\n\n .breakdown-row:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .breakdown-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n .breakdown-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n white-space: nowrap;\n }\n\n .breakdown-bar-track {\n width: 60px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .breakdown-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.3s;\n }\n\n .breakdown-empty {\n font-size: 13px;\n color: var(--mj-text-muted);\n padding: 8px 0;\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-dot.dot-completed { background: var(--mj-status-success); }\n .status-dot.dot-failed { background: var(--mj-status-error); }\n .status-dot.dot-running { background: var(--mj-brand-primary); }\n .status-dot.dot-pending { background: var(--mj-status-warning); }\n .status-dot.dot-cancelled { background: var(--mj-text-muted); }\n\n /* ── Table Panel ── */\n\n .table-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .table-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .table-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .table-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .table-scroll {\n overflow-x: auto;\n }\n\n .runs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .runs-table th {\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n user-select: none;\n }\n\n .runs-table th.sortable {\n cursor: pointer;\n }\n\n .runs-table th.sortable:hover {\n color: var(--mj-text-primary);\n }\n\n .runs-table th.sorted {\n color: var(--mj-brand-primary);\n }\n\n .runs-table th i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .runs-table td {\n padding: 10px 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .runs-table tr.row-even {\n background: var(--mj-bg-surface-card);\n }\n\n .runs-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-timestamp {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-size: 12px;\n }\n\n .cell-prompt {\n font-weight: 600;\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .cell-number {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .model-tag {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n }\n\n .status-pill {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n }\n\n .pill-completed {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n }\n\n .pill-failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n }\n\n .pill-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .pill-pending {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .pill-cancelled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-muted);\n padding: 24px 14px;\n }\n\n /* ── Pagination ── */\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .page-btn {\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n }\n\n .page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .page-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* ── Responsive ── */\n\n @media (max-width: 1200px) {\n .breakdown-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .breakdown-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n }\n `]\n})\nexport class AnalyticsPromptRunsComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n private isInitialized = false;\n\n // ── Inputs with setter pattern ──\n\n private _timeRange = '24h';\n @Input()\n set TimeRange(value: string) {\n if (value !== this._timeRange) {\n this._timeRange = value;\n if (this.isInitialized) {\n this.LoadData();\n }\n }\n }\n get TimeRange(): string {\n return this._timeRange;\n }\n\n private _filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n @Input()\n set Filters(value: GlobalFilterState) {\n this._filters = value;\n if (this.isInitialized) {\n this.resetPagination();\n this.cdr.detectChanges();\n }\n }\n get Filters(): GlobalFilterState {\n return this._filters;\n }\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n // ── State ──\n\n public IsLoading = false;\n public ActiveChartMetric: ChartMetric = 'volume';\n public SortField: SortField = 'RunAt';\n public SortDirection: SortDirection = 'desc';\n public CurrentPage = 1;\n\n private allRuns: PromptRunRecord[] = [];\n\n readonly ChartMetricOptions: { key: ChartMetric; label: string }[] = [\n { key: 'volume', label: 'By Volume' },\n { key: 'cost', label: 'By Cost' },\n { key: 'tokens', label: 'By Tokens' },\n ];\n\n readonly TableColumns: { field: SortField; label: string; sortable: boolean }[] = [\n { field: 'RunAt', label: 'Timestamp', sortable: true },\n { field: 'Prompt', label: 'Prompt', sortable: true },\n { field: 'Model', label: 'Model', sortable: true },\n { field: 'Status', label: 'Status', sortable: true },\n { field: 'ExecutionTimeMS', label: 'Duration', sortable: true },\n { field: 'TokensUsed', label: 'Tokens', sortable: true },\n { field: 'Cost', label: 'Cost', sortable: true },\n ];\n\n // ── Lifecycle ──\n\n async ngOnInit(): Promise<void> {\n this.isInitialized = true;\n await this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Computed Properties ──\n\n get FilteredRuns(): PromptRunRecord[] {\n return this.applyFilters(this.allRuns);\n }\n\n get Stats(): PromptRunStats {\n return this.computeStats(this.FilteredRuns);\n }\n\n get ChartBuckets(): ChartBucket[] {\n return this.computeChartBuckets(this.FilteredRuns);\n }\n\n get ModelBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Model', 'ModelID');\n }\n\n get PromptBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Prompt', 'PromptID');\n }\n\n get StatusBreakdown(): StatusBreakdownItem[] {\n return this.computeStatusBreakdown(this.FilteredRuns);\n }\n\n get PagedRuns(): PromptRunRecord[] {\n const sorted = this.sortRuns(this.FilteredRuns);\n const start = (this.CurrentPage - 1) * PAGE_SIZE;\n return sorted.slice(start, start + PAGE_SIZE);\n }\n\n get TotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredRuns.length / PAGE_SIZE));\n }\n\n // ── Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n }\n\n public OnChartMetricChange(metric: ChartMetric): void {\n this.ActiveChartMetric = metric;\n this.cdr.detectChanges();\n }\n\n public OnChartBucketClick(_bucket: ChartBucket): void {\n // Future: drill into time range\n }\n\n public OnSortChange(field: SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = 'desc';\n }\n this.resetPagination();\n this.cdr.detectChanges();\n }\n\n public OnPageChange(page: number): void {\n if (page >= 1 && page <= this.TotalPages) {\n this.CurrentPage = page;\n this.cdr.detectChanges();\n }\n }\n\n public ApplyModelFilter(modelId: string): void {\n this.Filters = { ...this.Filters, Models: [modelId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyPromptFilter(promptId: string): void {\n this.Filters = { ...this.Filters, Prompts: [promptId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyStatusFilter(status: string): void {\n this.Filters = { ...this.Filters, Statuses: [status] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ExportCSV(): void {\n const headers = ['Timestamp', 'Prompt', 'Model', 'Status', 'Duration(ms)', 'Tokens', 'Cost'];\n const rows = this.FilteredRuns.map(r => [\n r.RunAt,\n r.Prompt ?? '',\n r.Model ?? '',\n r.Status,\n r.ExecutionTimeMS?.toString() ?? '',\n r.TokensUsed?.toString() ?? '',\n r.Cost?.toString() ?? ''\n ]);\n const csv = [headers, ...rows].map(r => r.join(',')).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `prompt-runs-${new Date().toISOString().slice(0, 10)}.csv`;\n anchor.click();\n URL.revokeObjectURL(url);\n }\n\n // ── Formatting Helpers ──\n\n public FormatCurrency(value: number | null, decimals: number): string {\n if (value == null || isNaN(value)) return '$0.00';\n return '$' + value.toFixed(decimals);\n }\n\n public FormatTimestamp(dateStr: string): string {\n const d = new Date(dateStr);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) +\n ' ' + d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n }\n\n public FormatDuration(ms: number | null): string {\n if (ms == null) return '-';\n if (ms < 1000) return ms + 'ms';\n return (ms / 1000).toFixed(2) + 's';\n }\n\n public FormatChartValue(value: number): string {\n if (this.ActiveChartMetric === 'cost') {\n return '$' + value.toFixed(2);\n }\n if (value >= 1000) {\n return (value / 1000).toFixed(1) + 'k';\n }\n return value.toFixed(0);\n }\n\n public GetStatusClass(status: string): string {\n const key = status.toLowerCase();\n return 'pill-' + key;\n }\n\n // ── Data Loading ──\n\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const cutoff = this.getTimeRangeCutoff(this._timeRange);\n const filter = cutoff ? `RunAt >= '${cutoff.toISOString()}'` : '';\n\n const result = await rv.RunView<PromptRunRecord>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: filter,\n OrderBy: 'RunAt DESC',\n Fields: FIELDS,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.allRuns = result.Results;\n } else {\n this.allRuns = [];\n }\n } catch {\n this.allRuns = [];\n }\n\n this.resetPagination();\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n // ── Private Helpers ──\n\n private applyFilters(runs: PromptRunRecord[]): PromptRunRecord[] {\n let filtered = runs;\n\n if (this._filters.Models.length > 0) {\n filtered = filtered.filter(r => r.ModelID != null && this._filters.Models.includes(r.ModelID));\n }\n if (this._filters.Agents.length > 0) {\n filtered = filtered.filter(r => r.AgentID != null && this._filters.Agents.includes(r.AgentID));\n }\n if (this._filters.Prompts.length > 0) {\n filtered = filtered.filter(r => r.PromptID != null && this._filters.Prompts.includes(r.PromptID));\n }\n if (this._filters.Statuses.length > 0) {\n filtered = filtered.filter(r => this._filters.Statuses.includes(r.Status));\n }\n\n return filtered;\n }\n\n private computeStats(runs: PromptRunRecord[]): PromptRunStats {\n const total = runs.length;\n if (total === 0) {\n return { TotalRuns: 0, AvgCost: 0, AvgTokens: 0, AvgLatencySeconds: 0, SuccessRate: 0, P95LatencySeconds: 0, TotalCost: 0 };\n }\n\n const totalCost = this.sumNullable(runs, r => r.Cost);\n const totalTokens = this.sumNullable(runs, r => r.TokensUsed);\n const latencies = this.collectNonNull(runs, r => r.ExecutionTimeMS);\n const avgLatencyMs = latencies.length > 0 ? latencies.reduce((a, b) => a + b, 0) / latencies.length : 0;\n const successCount = runs.filter(r => r.Status === 'Completed').length;\n const p95 = this.percentile(latencies, 95);\n\n return {\n TotalRuns: total,\n AvgCost: totalCost / total,\n AvgTokens: totalTokens / total,\n AvgLatencySeconds: avgLatencyMs / 1000,\n SuccessRate: (successCount / total) * 100,\n P95LatencySeconds: p95 / 1000,\n TotalCost: totalCost,\n };\n }\n\n private computeChartBuckets(runs: PromptRunRecord[]): ChartBucket[] {\n if (runs.length === 0) return [];\n\n const bucketCount = this.getBucketCount();\n const cutoff = this.getTimeRangeCutoff(this._timeRange) ?? new Date(runs[runs.length - 1].RunAt);\n const now = new Date();\n const rangeMs = now.getTime() - cutoff.getTime();\n const bucketMs = rangeMs / bucketCount;\n\n const buckets: { label: string; total: number; start: Date; end: Date }[] = [];\n for (let i = 0; i < bucketCount; i++) {\n const start = new Date(cutoff.getTime() + i * bucketMs);\n const end = new Date(cutoff.getTime() + (i + 1) * bucketMs);\n buckets.push({\n label: this.formatBucketLabel(start),\n total: 0,\n start,\n end,\n });\n }\n\n for (const run of runs) {\n const runTime = new Date(run.RunAt).getTime();\n const idx = Math.min(Math.floor((runTime - cutoff.getTime()) / bucketMs), bucketCount - 1);\n if (idx >= 0 && idx < bucketCount) {\n buckets[idx].total += this.getChartMetricValue(run);\n }\n }\n\n const max = Math.max(...buckets.map(b => b.total), 1);\n\n return buckets.map(b => ({\n label: b.label,\n value: Math.round(b.total * 100) / 100,\n heightPercent: Math.max((b.total / max) * 100, 1),\n startTime: b.start,\n endTime: b.end,\n }));\n }\n\n private getChartMetricValue(run: PromptRunRecord): number {\n switch (this.ActiveChartMetric) {\n case 'cost': return run.Cost ?? 0;\n case 'tokens': return run.TokensUsed ?? 0;\n default: return 1; // volume = count\n }\n }\n\n private computeBreakdown(runs: PromptRunRecord[], nameKey: 'Model' | 'Prompt', idKey: 'ModelID' | 'PromptID'): BreakdownItem[] {\n const counts = new Map<string, { name: string; count: number }>();\n for (const run of runs) {\n const id = run[idKey];\n const name = run[nameKey];\n if (id != null && name != null) {\n const existing = counts.get(id);\n if (existing) {\n existing.count++;\n } else {\n counts.set(id, { name, count: 1 });\n }\n }\n }\n\n const sorted = Array.from(counts.entries())\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 4);\n\n const maxCount = sorted.length > 0 ? sorted[0][1].count : 1;\n\n return sorted.map(([id, data]) => ({\n id,\n name: data.name,\n count: data.count,\n percentage: (data.count / maxCount) * 100,\n }));\n }\n\n private computeStatusBreakdown(runs: PromptRunRecord[]): StatusBreakdownItem[] {\n const total = runs.length;\n if (total === 0) return [];\n\n const counts = new Map<string, number>();\n for (const run of runs) {\n counts.set(run.Status, (counts.get(run.Status) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([status, count]) => ({\n id: status,\n name: status,\n count,\n percentage: (count / total) * 100,\n cssClass: 'dot-' + status.toLowerCase(),\n }));\n }\n\n private sortRuns(runs: PromptRunRecord[]): PromptRunRecord[] {\n const dir = this.SortDirection === 'asc' ? 1 : -1;\n return [...runs].sort((a, b) => {\n const aVal = a[this.SortField];\n const bVal = b[this.SortField];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return aVal.localeCompare(bVal) * dir;\n }\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return (aVal - bVal) * dir;\n }\n return String(aVal).localeCompare(String(bVal)) * dir;\n });\n }\n\n private getTimeRangeCutoff(range: string): Date | null {\n const now = new Date();\n switch (range) {\n case '1h': return new Date(now.getTime() - 60 * 60 * 1000);\n case '6h': return new Date(now.getTime() - 6 * 60 * 60 * 1000);\n case '24h': return new Date(now.getTime() - 24 * 60 * 60 * 1000);\n case '7d': return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case '30d': return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n default: return null;\n }\n }\n\n private getBucketCount(): number {\n switch (this._timeRange) {\n case '1h': return 12; // 5-min buckets\n case '6h': return 12; // 30-min buckets\n case '24h': return 24; // 1-hour buckets\n case '7d': return 14; // 12-hour buckets\n case '30d': return 30; // 1-day buckets\n default: return 24;\n }\n }\n\n private formatBucketLabel(date: Date): string {\n switch (this._timeRange) {\n case '1h':\n case '6h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '24h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '7d':\n case '30d':\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n default:\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n }\n\n private sumNullable(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number {\n return runs.reduce((sum, r) => sum + (getter(r) ?? 0), 0);\n }\n\n private collectNonNull(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number[] {\n const result: number[] = [];\n for (const r of runs) {\n const val = getter(r);\n if (val != null) {\n result.push(val);\n }\n }\n return result;\n }\n\n private percentile(values: number[], pct: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((pct / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n }\n\n private resetPagination(): void {\n this.CurrentPage = 1;\n }\n}\n\nexport function LoadAnalyticsPromptRuns(): void {\n // Prevents tree-shaking of the component\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Usage Patterns Analytics.
|
|
3
|
+
*
|
|
4
|
+
* Displays a time-of-day heatmap (7 days × 24 hours), day-of-week distribution bars,
|
|
5
|
+
* peak hours summary cards, and an hourly throughput bar chart.
|
|
6
|
+
* Data loaded from MJ: AI Prompt Runs for the last 30 days.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
interface HeatmapCell {
|
|
11
|
+
Day: number;
|
|
12
|
+
Hour: number;
|
|
13
|
+
Count: number;
|
|
14
|
+
Intensity: number;
|
|
15
|
+
}
|
|
16
|
+
interface DayDistribution {
|
|
17
|
+
DayIndex: number;
|
|
18
|
+
DayName: string;
|
|
19
|
+
Count: number;
|
|
20
|
+
WidthPercent: number;
|
|
21
|
+
}
|
|
22
|
+
interface PeakSummary {
|
|
23
|
+
Label: string;
|
|
24
|
+
Value: string;
|
|
25
|
+
Count: number;
|
|
26
|
+
Icon: string;
|
|
27
|
+
}
|
|
28
|
+
interface HourlyBar {
|
|
29
|
+
Hour: number;
|
|
30
|
+
Label: string;
|
|
31
|
+
Count: number;
|
|
32
|
+
HeightPercent: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class AnalyticsUsagePatternsComponent implements OnInit, OnDestroy {
|
|
35
|
+
private _timeRange;
|
|
36
|
+
private isInitialized;
|
|
37
|
+
set TimeRange(value: string);
|
|
38
|
+
get TimeRange(): string;
|
|
39
|
+
TimeRangeChange: EventEmitter<string>;
|
|
40
|
+
IsLoading: boolean;
|
|
41
|
+
TotalRuns: number;
|
|
42
|
+
HeatmapCells: HeatmapCell[][];
|
|
43
|
+
DayDistributions: DayDistribution[];
|
|
44
|
+
PeakSummaries: PeakSummary[];
|
|
45
|
+
HourlyBars: HourlyBar[];
|
|
46
|
+
readonly DayNames: string[];
|
|
47
|
+
readonly Hours: number[];
|
|
48
|
+
private destroy$;
|
|
49
|
+
private cdr;
|
|
50
|
+
ngOnInit(): Promise<void>;
|
|
51
|
+
OnTimeRangeChange(range: string): void;
|
|
52
|
+
ngOnDestroy(): void;
|
|
53
|
+
getCellBackground(day: number, hour: number): string;
|
|
54
|
+
getCellTooltip(day: number, hour: number): string;
|
|
55
|
+
getCellCount(day: number, hour: number): number;
|
|
56
|
+
private loadData;
|
|
57
|
+
private fetchPromptRuns;
|
|
58
|
+
/**
|
|
59
|
+
* Build a 7×24 count matrix: dayCounts[dayIndex][hour] = count.
|
|
60
|
+
* dayIndex 0 = Monday, 6 = Sunday. Uses the JS Date getDay() offset.
|
|
61
|
+
*/
|
|
62
|
+
private buildDayHourCounts;
|
|
63
|
+
private buildHeatmap;
|
|
64
|
+
private buildDayDistributions;
|
|
65
|
+
private buildHourlyBars;
|
|
66
|
+
private buildPeakSummaries;
|
|
67
|
+
private findMaxCount;
|
|
68
|
+
private indexOfMax;
|
|
69
|
+
private formatHourLabel;
|
|
70
|
+
private formatHourRange;
|
|
71
|
+
private formatHour12;
|
|
72
|
+
private fullDayName;
|
|
73
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsUsagePatternsComponent, never>;
|
|
74
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnalyticsUsagePatternsComponent, "app-analytics-usage-patterns", never, { "TimeRange": { "alias": "TimeRange"; "required": false; }; }, { "TimeRangeChange": "TimeRangeChange"; }, never, never, false, never>;
|
|
75
|
+
}
|
|
76
|
+
export declare function LoadAnalyticsUsagePatterns(): void;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=usage-patterns.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-patterns.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/usage-patterns/usage-patterns.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACuB,YAAY,EACtC,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;;AAevB,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,WAAW;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,SAAS;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACzB;AASD,qBAwda,+BAAgC,YAAW,MAAM,EAAE,SAAS;IAErE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAE9B,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAO1B;IACD,IAAI,SAAS,IAAI,MAAM,CAA4B;IAEzC,eAAe,uBAA8B;IAGvD,SAAS,UAAQ;IACjB,SAAS,SAAK;IAEd,YAAY,EAAE,WAAW,EAAE,EAAE,CAAM;IACnC,gBAAgB,EAAE,eAAe,EAAE,CAAM;IACzC,aAAa,EAAE,WAAW,EAAE,CAAM;IAClC,UAAU,EAAE,SAAS,EAAE,CAAM;IAE7B,QAAQ,CAAC,QAAQ,WAAa;IAC9B,QAAQ,CAAC,KAAK,WAAS;IAGvB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,GAAG,CAA6B;IAElC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,WAAW,IAAI,IAAI;IAOnB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAKpD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAKjD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;YAMjC,QAAQ;YAuBR,eAAe;IA2B7B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAkD1B,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;yCAtQV,+BAA+B;2CAA/B,+BAA+B;CA0Q3C;AAED,wBAAgB,0BAA0B,SAAoC"}
|