@memberjunction/ng-dashboards 2.48.0 → 2.49.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 (92) hide show
  1. package/README.md +105 -2
  2. package/dist/AI/ai-dashboard.component.d.ts +2 -0
  3. package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
  4. package/dist/AI/ai-dashboard.component.js +66 -43
  5. package/dist/AI/ai-dashboard.component.js.map +1 -1
  6. package/dist/AI/components/agents/agent-configuration.component.js +45 -58
  7. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  8. package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
  9. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  10. package/dist/AI/components/agents/agent-editor.component.js +368 -366
  11. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  12. package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
  13. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  14. package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
  15. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
  16. package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
  17. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
  18. package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
  19. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
  20. package/dist/AI/components/charts/time-series-chart.component.js +547 -0
  21. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
  22. package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
  23. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  24. package/dist/AI/components/execution-monitoring.component.js +2032 -20
  25. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  26. package/dist/AI/components/models/model-management.component.js +211 -237
  27. package/dist/AI/components/models/model-management.component.js.map +1 -1
  28. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
  29. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  30. package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
  31. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  32. package/dist/AI/components/prompts/prompt-management.component.js +381 -424
  33. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  34. package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
  35. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  36. package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
  37. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  38. package/dist/AI/components/system/system-configuration.component.js +86 -99
  39. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  40. package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
  41. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
  42. package/dist/AI/components/widgets/kpi-card.component.js +163 -0
  43. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
  44. package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
  45. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
  46. package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
  47. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
  48. package/dist/AI/index.d.ts +7 -0
  49. package/dist/AI/index.d.ts.map +1 -0
  50. package/dist/AI/index.js +9 -0
  51. package/dist/AI/index.js.map +1 -0
  52. package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
  53. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
  54. package/dist/AI/services/ai-instrumentation.service.js +490 -0
  55. package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
  56. package/dist/Actions/actions-management-dashboard.component.js +40 -41
  57. package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
  58. package/dist/Actions/components/actions-list-view.component.js +117 -134
  59. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  60. package/dist/Actions/components/actions-overview.component.js +274 -296
  61. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  62. package/dist/Actions/components/categories-list-view.component.js +12 -14
  63. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  64. package/dist/Actions/components/code-management.component.js +12 -14
  65. package/dist/Actions/components/code-management.component.js.map +1 -1
  66. package/dist/Actions/components/entity-integration.component.js +12 -14
  67. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  68. package/dist/Actions/components/execution-monitoring.component.js +238 -256
  69. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  70. package/dist/Actions/components/executions-list-view.component.js +12 -14
  71. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  72. package/dist/Actions/components/scheduled-actions.component.js +12 -14
  73. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  74. package/dist/Actions/components/security-permissions.component.js +12 -14
  75. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  76. package/dist/EntityAdmin/components/entity-details.component.js +105 -107
  77. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
  78. package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
  79. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
  80. package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
  81. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
  82. package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
  83. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
  84. package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
  85. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  86. package/dist/generic/base-dashboard.js +28 -40
  87. package/dist/generic/base-dashboard.js.map +1 -1
  88. package/dist/module.d.ts +16 -12
  89. package/dist/module.d.ts.map +1 -1
  90. package/dist/module.js +36 -15
  91. package/dist/module.js.map +1 -1
  92. package/package.json +6 -6
@@ -0,0 +1,547 @@
1
+ import { Component, Input, ViewChild, Output, EventEmitter } from '@angular/core';
2
+ import * as d3 from 'd3';
3
+ import * as i0 from "@angular/core";
4
+ const _c0 = ["chartSvg"];
5
+ const _c1 = ["tooltip"];
6
+ function TimeSeriesChartComponent_Conditional_1_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
7
+ const _r1 = i0.ɵɵgetCurrentView();
8
+ i0.ɵɵelementStart(0, "div", 9);
9
+ i0.ɵɵlistener("click", function TimeSeriesChartComponent_Conditional_1_Conditional_3_For_2_Template_div_click_0_listener() { const metric_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleMetric(metric_r2)); });
10
+ i0.ɵɵelement(1, "div", 10);
11
+ i0.ɵɵelementStart(2, "span", 11);
12
+ i0.ɵɵtext(3);
13
+ i0.ɵɵelementEnd()();
14
+ } if (rf & 2) {
15
+ const metric_r2 = ctx.$implicit;
16
+ const ctx_r2 = i0.ɵɵnextContext(3);
17
+ i0.ɵɵclassProp("legend-item--disabled", !ctx_r2.isMetricVisible(metric_r2));
18
+ i0.ɵɵadvance();
19
+ i0.ɵɵstyleProp("background-color", ctx_r2.getMetricColor(metric_r2));
20
+ i0.ɵɵadvance(2);
21
+ i0.ɵɵtextInterpolate(ctx_r2.getMetricLabel(metric_r2));
22
+ } }
23
+ function TimeSeriesChartComponent_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelementStart(0, "div", 7);
25
+ i0.ɵɵrepeaterCreate(1, TimeSeriesChartComponent_Conditional_1_Conditional_3_For_2_Template, 4, 5, "div", 8, i0.ɵɵrepeaterTrackByIdentity);
26
+ i0.ɵɵelementEnd();
27
+ } if (rf & 2) {
28
+ const ctx_r2 = i0.ɵɵnextContext(2);
29
+ i0.ɵɵadvance();
30
+ i0.ɵɵrepeater(ctx_r2.visibleMetrics);
31
+ } }
32
+ function TimeSeriesChartComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "div", 3)(1, "h4", 6);
34
+ i0.ɵɵtext(2);
35
+ i0.ɵɵelementEnd();
36
+ i0.ɵɵtemplate(3, TimeSeriesChartComponent_Conditional_1_Conditional_3_Template, 3, 0, "div", 7);
37
+ i0.ɵɵelementEnd();
38
+ } if (rf & 2) {
39
+ const ctx_r2 = i0.ɵɵnextContext();
40
+ i0.ɵɵadvance(2);
41
+ i0.ɵɵtextInterpolate(ctx_r2.title);
42
+ i0.ɵɵadvance();
43
+ i0.ɵɵconditional(ctx_r2.showLegend ? 3 : -1);
44
+ } }
45
+ export class TimeSeriesChartComponent {
46
+ data = [];
47
+ title;
48
+ config = {};
49
+ showLegend = true;
50
+ showControls = true;
51
+ dataPointClick = new EventEmitter();
52
+ timeRangeChange = new EventEmitter();
53
+ chartSvg;
54
+ tooltip;
55
+ svg;
56
+ width = 0;
57
+ height = 0;
58
+ margin = { top: 10, right: 70, bottom: 50, left: 70 }; // Increased bottom margin for x-axis labels
59
+ // Chart configuration
60
+ defaultColors = ['#2196f3', '#4caf50', '#ff9800', '#f44336', '#9c27b0'];
61
+ // Metrics configuration
62
+ visibleMetrics = ['executions', 'cost', 'tokens', 'avgTime', 'errors'];
63
+ hiddenMetrics = new Set();
64
+ ngOnInit() {
65
+ this.applyConfig();
66
+ }
67
+ ngAfterViewInit() {
68
+ this.initChart();
69
+ this.updateChart();
70
+ }
71
+ ngOnChanges(changes) {
72
+ if (changes['data'] && !changes['data'].firstChange) {
73
+ this.updateChart();
74
+ }
75
+ if (changes['config'] && !changes['config'].firstChange) {
76
+ this.applyConfig();
77
+ this.updateChart();
78
+ }
79
+ }
80
+ ngOnDestroy() {
81
+ // Cleanup D3 event listeners
82
+ d3.select(window).on('resize.timeseries', null);
83
+ }
84
+ applyConfig() {
85
+ const config = this.config;
86
+ this.margin = { ...this.margin, ...config.margin };
87
+ }
88
+ initChart() {
89
+ this.svg = d3.select(this.chartSvg.nativeElement);
90
+ // Set up responsive behavior
91
+ d3.select(window).on('resize.timeseries', () => this.updateChart());
92
+ }
93
+ updateChart() {
94
+ if (!this.data || this.data.length === 0) {
95
+ this.svg.selectAll('*').remove();
96
+ return;
97
+ }
98
+ this.calculateDimensions();
99
+ this.svg.selectAll('*').remove();
100
+ this.drawChart();
101
+ }
102
+ calculateDimensions() {
103
+ const container = this.chartSvg.nativeElement.parentElement;
104
+ const containerWidth = container.clientWidth;
105
+ const containerHeight = container.clientHeight;
106
+ // Use config dimensions or fallback to container dimensions
107
+ this.width = (this.config.width || containerWidth) - this.margin.left - this.margin.right;
108
+ this.height = (this.config.height || Math.max(containerHeight, 200)) - this.margin.top - this.margin.bottom;
109
+ // Ensure minimum dimensions for usability
110
+ this.width = Math.max(this.width, 200);
111
+ this.height = Math.max(this.height, 150);
112
+ this.svg
113
+ .attr('width', this.width + this.margin.left + this.margin.right)
114
+ .attr('height', this.height + this.margin.top + this.margin.bottom);
115
+ }
116
+ drawChart() {
117
+ const g = this.svg.append('g')
118
+ .attr('transform', `translate(${this.margin.left},${this.margin.top})`);
119
+ // Create scales
120
+ const xScale = d3.scaleTime()
121
+ .domain(d3.extent(this.data, d => d.timestamp))
122
+ .range([0, this.width]);
123
+ // Create separate scales for different metrics
124
+ const scales = this.createMetricScales();
125
+ // Draw grid
126
+ if (this.config.showGrid !== false) {
127
+ this.drawGrid(g, xScale, scales);
128
+ }
129
+ // Draw axes
130
+ this.drawAxes(g, xScale, scales);
131
+ // Draw data lines and areas
132
+ this.drawMetrics(g, xScale, scales);
133
+ // Draw interactive elements
134
+ this.drawInteractiveElements(g, xScale, scales);
135
+ }
136
+ createMetricScales() {
137
+ const scales = {};
138
+ if (this.config.useDualAxis !== false) {
139
+ // Dual axis mode: Left axis (cost, avgTime), Right axis (executions, tokens, errors)
140
+ const leftAxisMetrics = ['cost', 'avgTime'];
141
+ const rightAxisMetrics = ['executions', 'tokens', 'errors'];
142
+ // Create left axis scale (cost and time)
143
+ const leftValues = leftAxisMetrics.flatMap(metric => this.data.map(d => {
144
+ const value = this.getMetricValue(d, metric);
145
+ // Normalize avgTime to seconds for better scale comparison with cost
146
+ return metric === 'avgTime' ? (value || 0) / 1000 : (value || 0);
147
+ }).filter((v) => v != null));
148
+ if (leftValues.length > 0) {
149
+ const maxLeftValue = Math.max(...leftValues);
150
+ const leftScale = d3.scaleLinear()
151
+ .domain([0, maxLeftValue])
152
+ .range([this.height, 0])
153
+ .nice();
154
+ leftAxisMetrics.forEach(metric => scales[metric] = leftScale);
155
+ }
156
+ // Create right axis scale (count-based metrics)
157
+ const rightValues = rightAxisMetrics.flatMap(metric => this.data.map(d => this.getMetricValue(d, metric)).filter((v) => v != null));
158
+ if (rightValues.length > 0) {
159
+ const maxRightValue = Math.max(...rightValues);
160
+ const rightScale = d3.scaleLinear()
161
+ .domain([0, maxRightValue])
162
+ .range([this.height, 0])
163
+ .nice();
164
+ rightAxisMetrics.forEach(metric => scales[metric] = rightScale);
165
+ }
166
+ }
167
+ else {
168
+ // Single axis mode (original behavior)
169
+ const metricGroups = {
170
+ count: ['executions', 'errors'],
171
+ cost: ['cost'],
172
+ tokens: ['tokens'],
173
+ time: ['avgTime']
174
+ };
175
+ Object.entries(metricGroups).forEach(([groupName, metrics]) => {
176
+ const allValues = metrics.flatMap(metric => this.data.map(d => this.getMetricValue(d, metric)).filter((v) => v != null));
177
+ if (allValues.length > 0) {
178
+ const maxValue = Math.max(...allValues);
179
+ const scale = d3.scaleLinear()
180
+ .domain([0, maxValue])
181
+ .range([this.height, 0])
182
+ .nice();
183
+ metrics.forEach(metric => scales[metric] = scale);
184
+ }
185
+ });
186
+ }
187
+ return scales;
188
+ }
189
+ drawGrid(g, xScale, scales) {
190
+ // Vertical grid lines
191
+ g.selectAll('.grid-line-x')
192
+ .data(xScale.ticks(6))
193
+ .enter().append('line')
194
+ .attr('class', 'grid-line grid-line-x')
195
+ .attr('x1', (d) => xScale(d))
196
+ .attr('x2', (d) => xScale(d))
197
+ .attr('y1', 0)
198
+ .attr('y2', this.height);
199
+ // Horizontal grid lines (use first scale)
200
+ const firstScale = Object.values(scales)[0];
201
+ if (firstScale) {
202
+ g.selectAll('.grid-line-y')
203
+ .data(firstScale.ticks(5))
204
+ .enter().append('line')
205
+ .attr('class', 'grid-line grid-line-y')
206
+ .attr('x1', 0)
207
+ .attr('x2', this.width)
208
+ .attr('y1', (d) => firstScale(d))
209
+ .attr('y2', (d) => firstScale(d));
210
+ }
211
+ }
212
+ drawAxes(g, xScale, scales) {
213
+ // X axis
214
+ g.append('g')
215
+ .attr('class', 'axis axis-x')
216
+ .attr('transform', `translate(0,${this.height})`)
217
+ .call(d3.axisBottom(xScale)
218
+ .ticks(6)
219
+ .tickFormat(d3.timeFormat('%H:%M')));
220
+ if (this.config.useDualAxis !== false) {
221
+ // Dual Y-axis mode
222
+ const leftAxisMetrics = ['cost', 'avgTime'];
223
+ const rightAxisMetrics = ['executions', 'tokens', 'errors'];
224
+ // Left Y axis (cost, time)
225
+ const leftScale = scales[leftAxisMetrics[0]];
226
+ if (leftScale) {
227
+ g.append('g')
228
+ .attr('class', 'axis axis-y axis-y-left')
229
+ .call(d3.axisLeft(leftScale)
230
+ .ticks(5)
231
+ .tickFormat((d) => {
232
+ const value = d;
233
+ // Format based on value range - if > 1, likely cost, else time in seconds
234
+ return value > 1 ? `$${value.toFixed(2)}` : `${value.toFixed(1)}s`;
235
+ }));
236
+ // Left axis label
237
+ g.append('text')
238
+ .attr('class', 'axis-label axis-label-left')
239
+ .attr('transform', 'rotate(-90)')
240
+ .attr('y', 0 - this.margin.left + 20)
241
+ .attr('x', 0 - (this.height / 2))
242
+ .style('text-anchor', 'middle')
243
+ .style('font-size', '12px')
244
+ .style('fill', '#666')
245
+ .text('Cost ($) / Time (s)');
246
+ }
247
+ // Right Y axis (counts)
248
+ const rightScale = scales[rightAxisMetrics[0]];
249
+ if (rightScale) {
250
+ g.append('g')
251
+ .attr('class', 'axis axis-y axis-y-right')
252
+ .attr('transform', `translate(${this.width},0)`)
253
+ .call(d3.axisRight(rightScale)
254
+ .ticks(5)
255
+ .tickFormat((d) => {
256
+ const value = d;
257
+ // Format large numbers with K/M suffixes
258
+ if (value >= 1000000)
259
+ return `${(value / 1000000).toFixed(1)}M`;
260
+ if (value >= 1000)
261
+ return `${(value / 1000).toFixed(1)}K`;
262
+ return value.toString();
263
+ }));
264
+ // Right axis label
265
+ g.append('text')
266
+ .attr('class', 'axis-label axis-label-right')
267
+ .attr('transform', 'rotate(90)')
268
+ .attr('y', 0 - this.width - this.margin.right + 20)
269
+ .attr('x', this.height / 2)
270
+ .style('text-anchor', 'middle')
271
+ .style('font-size', '12px')
272
+ .style('fill', '#666')
273
+ .text('Count (Executions / Tokens)');
274
+ }
275
+ }
276
+ else {
277
+ // Single Y axis (original behavior)
278
+ const firstScale = Object.values(scales)[0];
279
+ if (firstScale) {
280
+ g.append('g')
281
+ .attr('class', 'axis axis-y')
282
+ .call(d3.axisLeft(firstScale).ticks(5));
283
+ }
284
+ }
285
+ }
286
+ drawMetrics(g, xScale, scales) {
287
+ // Create a group for lines and areas
288
+ const linesGroup = g.append('g').attr('class', 'lines-group');
289
+ // First draw all lines and areas
290
+ this.visibleMetrics.forEach((metric) => {
291
+ if (this.hiddenMetrics.has(metric) || !scales[metric])
292
+ return;
293
+ const color = this.getMetricColor(metric);
294
+ const scale = scales[metric];
295
+ // Create line generator with proper value transformation
296
+ const line = d3.line()
297
+ .x(d => xScale(d.timestamp))
298
+ .y(d => {
299
+ const value = this.getMetricValue(d, metric) || 0;
300
+ // Normalize avgTime to seconds if using dual axis
301
+ const transformedValue = (this.config.useDualAxis !== false && metric === 'avgTime')
302
+ ? value / 1000 : value;
303
+ return scale(transformedValue);
304
+ })
305
+ .curve(d3.curveMonotoneX);
306
+ // Create area generator with proper value transformation
307
+ const area = d3.area()
308
+ .x(d => xScale(d.timestamp))
309
+ .y0(this.height)
310
+ .y1(d => {
311
+ const value = this.getMetricValue(d, metric) || 0;
312
+ // Normalize avgTime to seconds if using dual axis
313
+ const transformedValue = (this.config.useDualAxis !== false && metric === 'avgTime')
314
+ ? value / 1000 : value;
315
+ return scale(transformedValue);
316
+ })
317
+ .curve(d3.curveMonotoneX);
318
+ // Draw area (optional)
319
+ if (metric === 'executions' || metric === 'cost') {
320
+ linesGroup.append('path')
321
+ .datum(this.data)
322
+ .attr('class', `chart-area chart-area--${metric}`)
323
+ .attr('d', area)
324
+ .attr('fill', color);
325
+ }
326
+ // Draw line
327
+ linesGroup.append('path')
328
+ .datum(this.data)
329
+ .attr('class', `chart-line chart-line--${metric}`)
330
+ .attr('d', line)
331
+ .attr('stroke', color);
332
+ });
333
+ // Then create dots group on top of everything
334
+ const dotsGroup = g.append('g').attr('class', 'dots-group').style('pointer-events', 'all');
335
+ // Draw all dots in a separate pass so they're all on top
336
+ this.visibleMetrics.forEach((metric) => {
337
+ if (this.hiddenMetrics.has(metric) || !scales[metric])
338
+ return;
339
+ const color = this.getMetricColor(metric);
340
+ const scale = scales[metric];
341
+ // Draw dots with click events - only for non-zero values
342
+ const dotsData = this.data.filter(d => {
343
+ const value = this.getMetricValue(d, metric);
344
+ return value != null && value > 0;
345
+ });
346
+ const dots = dotsGroup.selectAll(`.chart-dot--${metric}`)
347
+ .data(dotsData)
348
+ .enter().append('circle')
349
+ .attr('class', `chart-dot chart-dot--${metric}`)
350
+ .attr('cx', (d) => xScale(d.timestamp))
351
+ .attr('cy', (d) => {
352
+ const value = this.getMetricValue(d, metric) || 0;
353
+ // Normalize avgTime to seconds if using dual axis
354
+ const transformedValue = (this.config.useDualAxis !== false && metric === 'avgTime')
355
+ ? value / 1000 : value;
356
+ return scale(transformedValue);
357
+ })
358
+ .attr('r', 4) // Slightly larger for easier clicking
359
+ .attr('stroke', color)
360
+ .attr('stroke-width', 2)
361
+ .attr('fill', 'white')
362
+ .style('cursor', 'pointer')
363
+ .style('pointer-events', 'all') // Ensure clicks are captured
364
+ .style('z-index', 1000) // Ensure dots are on top
365
+ .attr('data-metric', metric) // Add data attribute for debugging
366
+ .on('mouseenter', (event, d) => {
367
+ // Bring to front on hover
368
+ const dot = d3.select(event.currentTarget);
369
+ dot.raise();
370
+ dot.attr('r', 6);
371
+ // Show tooltip
372
+ if (this.config.showTooltip !== false) {
373
+ this.showTooltip(event, d);
374
+ }
375
+ })
376
+ .on('mouseleave', (event, d) => {
377
+ const dot = d3.select(event.currentTarget);
378
+ dot.attr('r', 4);
379
+ // Hide tooltip
380
+ if (this.config.showTooltip !== false) {
381
+ this.hideTooltip();
382
+ }
383
+ })
384
+ .on('click', (event, d) => {
385
+ event.stopPropagation();
386
+ event.preventDefault();
387
+ // Only emit if there's actual data
388
+ const value = this.getMetricValue(d, metric);
389
+ if (value != null && value > 0) {
390
+ this.dataPointClick.emit({ data: d, metric, event });
391
+ }
392
+ });
393
+ });
394
+ }
395
+ drawInteractiveElements(g, xScale, scales) {
396
+ if (this.config.showTooltip === false)
397
+ return;
398
+ // Note: We don't need an overlay for tooltips as the dots themselves handle interactions
399
+ // The overlay was preventing click events on dots
400
+ }
401
+ findClosestDataPoint(targetDate) {
402
+ if (!this.data.length)
403
+ return null;
404
+ return this.data.reduce((closest, current) => {
405
+ const currentDiff = Math.abs(current.timestamp.getTime() - targetDate.getTime());
406
+ const closestDiff = Math.abs(closest.timestamp.getTime() - targetDate.getTime());
407
+ return currentDiff < closestDiff ? current : closest;
408
+ });
409
+ }
410
+ showTooltip(event, data) {
411
+ const tooltip = d3.select(this.tooltip.nativeElement);
412
+ const content = `
413
+ <div><strong>${d3.timeFormat('%H:%M')(data.timestamp)}</strong></div>
414
+ <div>Executions: ${data.executions.toLocaleString()}</div>
415
+ <div>Cost: $${data.cost.toFixed(4)}</div>
416
+ <div>Tokens: ${data.tokens.toLocaleString()}</div>
417
+ <div>Avg Time: ${(data.avgTime / 1000).toFixed(1)}s</div>
418
+ <div>Errors: ${data.errors}</div>
419
+ <div style="margin-top: 8px; padding-top: 8px; border-top: 1px solid rgba(255,255,255,0.3); font-size: 11px; color: rgba(255,255,255,0.8);">
420
+ Click data points to drill down
421
+ </div>
422
+ `;
423
+ tooltip
424
+ .style('display', 'block')
425
+ .html(content)
426
+ .style('left', (event.offsetX + 10) + 'px')
427
+ .style('top', (event.offsetY - 10) + 'px');
428
+ }
429
+ hideTooltip() {
430
+ d3.select(this.tooltip.nativeElement)
431
+ .style('display', 'none');
432
+ }
433
+ getMetricValue(data, metric) {
434
+ switch (metric) {
435
+ case 'executions': return data.executions;
436
+ case 'cost': return data.cost;
437
+ case 'tokens': return data.tokens;
438
+ case 'avgTime': return data.avgTime;
439
+ case 'errors': return data.errors;
440
+ default: return null;
441
+ }
442
+ }
443
+ getMetricColor(metric) {
444
+ const colors = this.config.colors || this.defaultColors;
445
+ const index = this.visibleMetrics.indexOf(metric);
446
+ return colors[index % colors.length];
447
+ }
448
+ getMetricLabel(metric) {
449
+ const labels = {
450
+ executions: 'Executions',
451
+ cost: 'Cost ($)',
452
+ tokens: 'Tokens',
453
+ avgTime: 'Avg Time (ms)',
454
+ errors: 'Errors'
455
+ };
456
+ return labels[metric] || metric;
457
+ }
458
+ isMetricVisible(metric) {
459
+ return !this.hiddenMetrics.has(metric);
460
+ }
461
+ toggleMetric(metric) {
462
+ if (this.hiddenMetrics.has(metric)) {
463
+ this.hiddenMetrics.delete(metric);
464
+ }
465
+ else {
466
+ this.hiddenMetrics.add(metric);
467
+ }
468
+ this.updateChart();
469
+ }
470
+ static ɵfac = function TimeSeriesChartComponent_Factory(t) { return new (t || TimeSeriesChartComponent)(); };
471
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TimeSeriesChartComponent, selectors: [["app-time-series-chart"]], viewQuery: function TimeSeriesChartComponent_Query(rf, ctx) { if (rf & 1) {
472
+ i0.ɵɵviewQuery(_c0, 7);
473
+ i0.ɵɵviewQuery(_c1, 7);
474
+ } if (rf & 2) {
475
+ let _t;
476
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chartSvg = _t.first);
477
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tooltip = _t.first);
478
+ } }, inputs: { data: "data", title: "title", config: "config", showLegend: "showLegend", showControls: "showControls" }, outputs: { dataPointClick: "dataPointClick", timeRangeChange: "timeRangeChange" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 1, consts: [["chartSvg", ""], ["tooltip", ""], [1, "time-series-chart"], [1, "chart-header"], [1, "chart-container"], [1, "chart-tooltip", 2, "display", "none"], [1, "chart-title"], [1, "chart-legend"], [1, "legend-item", 3, "legend-item--disabled"], [1, "legend-item", 3, "click"], [1, "legend-color"], [1, "legend-label"]], template: function TimeSeriesChartComponent_Template(rf, ctx) { if (rf & 1) {
479
+ i0.ɵɵelementStart(0, "div", 2);
480
+ i0.ɵɵtemplate(1, TimeSeriesChartComponent_Conditional_1_Template, 4, 2, "div", 3);
481
+ i0.ɵɵelementStart(2, "div", 4);
482
+ i0.ɵɵnamespaceSVG();
483
+ i0.ɵɵelement(3, "svg", null, 0);
484
+ i0.ɵɵnamespaceHTML();
485
+ i0.ɵɵelement(5, "div", 5, 1);
486
+ i0.ɵɵelementEnd()();
487
+ } if (rf & 2) {
488
+ i0.ɵɵadvance();
489
+ i0.ɵɵconditional(ctx.title ? 1 : -1);
490
+ } }, styles: [".time-series-chart[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n padding: 12px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden; \n\n }\n\n .chart-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n flex-wrap: wrap;\n gap: 12px;\n flex-shrink: 0; \n\n }\n\n .chart-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .chart-legend[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n transition: opacity 0.2s ease;\n font-size: 11px;\n }\n\n .legend-item--disabled[_ngcontent-%COMP%] {\n opacity: 0.4;\n }\n\n .legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n }\n\n .legend-label[_ngcontent-%COMP%] {\n color: #666;\n font-weight: 500;\n }\n\n .chart-container[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 0; \n\n }\n\n .chart-container[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }\n\n .chart-tooltip[_ngcontent-%COMP%] {\n position: absolute;\n background: rgba(0, 0, 0, 0.8);\n color: white;\n padding: 8px 12px;\n border-radius: 4px;\n font-size: 12px;\n pointer-events: none;\n z-index: 1000;\n max-width: 200px;\n }\n\n\n \n\n [_nghost-%COMP%] .chart-line {\n fill: none;\n stroke-width: 2;\n }\n\n [_nghost-%COMP%] .chart-area {\n fill-opacity: 0.1;\n }\n\n [_nghost-%COMP%] .chart-dot {\n transition: r 0.1s ease;\n }\n\n [_nghost-%COMP%] .chart-dot:hover {\n filter: drop-shadow(0 0 4px rgba(0,0,0,0.3));\n }\n\n [_nghost-%COMP%] .grid-line {\n stroke: #f0f0f0;\n stroke-width: 1;\n }\n\n [_nghost-%COMP%] .axis {\n font-size: 11px;\n color: #666;\n }\n\n [_nghost-%COMP%] .axis path {\n stroke: #ddd;\n }\n\n [_nghost-%COMP%] .axis .tick line {\n stroke: #ddd;\n }\n\n [_nghost-%COMP%] .axis-y-left {\n color: #2196f3;\n }\n\n [_nghost-%COMP%] .axis-y-right {\n color: #4caf50;\n }\n\n [_nghost-%COMP%] .axis-label {\n font-weight: 500;\n }\n\n @media (max-width: 768px) {\n .chart-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .chart-legend[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-start;\n }\n \n .chart-controls[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n }"] });
491
+ }
492
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TimeSeriesChartComponent, [{
493
+ type: Component,
494
+ args: [{ selector: 'app-time-series-chart', template: `
495
+ <div class="time-series-chart">
496
+ @if (title) {
497
+ <div class="chart-header">
498
+ <h4 class="chart-title">{{ title }}</h4>
499
+ @if (showLegend) {
500
+ <div class="chart-legend">
501
+ @for (metric of visibleMetrics; track metric) {
502
+ <div
503
+ class="legend-item"
504
+ (click)="toggleMetric(metric)"
505
+ [class.legend-item--disabled]="!isMetricVisible(metric)"
506
+ >
507
+ <div
508
+ class="legend-color"
509
+ [style.background-color]="getMetricColor(metric)"
510
+ ></div>
511
+ <span class="legend-label">{{ getMetricLabel(metric) }}</span>
512
+ </div>
513
+ }
514
+ </div>
515
+ }
516
+ </div>
517
+ }
518
+
519
+ <div class="chart-container">
520
+ <svg #chartSvg></svg>
521
+ <div class="chart-tooltip" #tooltip style="display: none;"></div>
522
+ </div>
523
+ </div>
524
+ `, styles: ["\n .time-series-chart {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n padding: 12px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden; /* Ensure content doesn't overflow */\n }\n\n .chart-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n flex-wrap: wrap;\n gap: 12px;\n flex-shrink: 0; /* Prevent header from being squeezed */\n }\n\n .chart-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n }\n\n .chart-legend {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n transition: opacity 0.2s ease;\n font-size: 11px;\n }\n\n .legend-item--disabled {\n opacity: 0.4;\n }\n\n .legend-color {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n }\n\n .legend-label {\n color: #666;\n font-weight: 500;\n }\n\n .chart-container {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 0; /* Important: allows flex child to shrink below content size */\n }\n\n .chart-container svg {\n width: 100%;\n height: 100%;\n }\n\n .chart-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.8);\n color: white;\n padding: 8px 12px;\n border-radius: 4px;\n font-size: 12px;\n pointer-events: none;\n z-index: 1000;\n max-width: 200px;\n }\n\n\n /* Chart styles */\n :host ::ng-deep .chart-line {\n fill: none;\n stroke-width: 2;\n }\n\n :host ::ng-deep .chart-area {\n fill-opacity: 0.1;\n }\n\n :host ::ng-deep .chart-dot {\n transition: r 0.1s ease;\n }\n\n :host ::ng-deep .chart-dot:hover {\n filter: drop-shadow(0 0 4px rgba(0,0,0,0.3));\n }\n\n :host ::ng-deep .grid-line {\n stroke: #f0f0f0;\n stroke-width: 1;\n }\n\n :host ::ng-deep .axis {\n font-size: 11px;\n color: #666;\n }\n\n :host ::ng-deep .axis path {\n stroke: #ddd;\n }\n\n :host ::ng-deep .axis .tick line {\n stroke: #ddd;\n }\n\n :host ::ng-deep .axis-y-left {\n color: #2196f3;\n }\n\n :host ::ng-deep .axis-y-right {\n color: #4caf50;\n }\n\n :host ::ng-deep .axis-label {\n font-weight: 500;\n }\n\n @media (max-width: 768px) {\n .chart-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .chart-legend {\n width: 100%;\n justify-content: flex-start;\n }\n \n .chart-controls {\n flex-wrap: wrap;\n }\n }\n "] }]
525
+ }], null, { data: [{
526
+ type: Input
527
+ }], title: [{
528
+ type: Input
529
+ }], config: [{
530
+ type: Input
531
+ }], showLegend: [{
532
+ type: Input
533
+ }], showControls: [{
534
+ type: Input
535
+ }], dataPointClick: [{
536
+ type: Output
537
+ }], timeRangeChange: [{
538
+ type: Output
539
+ }], chartSvg: [{
540
+ type: ViewChild,
541
+ args: ['chartSvg', { static: true }]
542
+ }], tooltip: [{
543
+ type: ViewChild,
544
+ args: ['tooltip', { static: true }]
545
+ }] }); })();
546
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TimeSeriesChartComponent, { className: "TimeSeriesChartComponent", filePath: "src/AI/components/charts/time-series-chart.component.ts", lineNumber: 204 }); })();
547
+ //# sourceMappingURL=time-series-chart.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-series-chart.component.js","sourceRoot":"","sources":["../../../../src/AI/components/charts/time-series-chart.component.ts"],"names":[],"mappings":"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"}