@@ -11,10 +11,35 @@ let timeseriesData, barChartsData, allRunNames;
11
11
let activeTags = new Set ( ) ;
12
12
let layerComparisonsData ;
13
13
let latestRunsLookup = new Map ( ) ;
14
+ let pendingCharts = new Map ( ) ; // Store chart data for lazy loading
15
+ let chartObserver ; // Intersection observer for lazy loading charts
14
16
15
17
// DOM Elements
16
18
let runSelect , selectedRunsDiv , suiteFiltersContainer , tagFiltersContainer ;
17
19
20
+ // Observer for lazy loading charts
21
+ function initChartObserver ( ) {
22
+ if ( chartObserver ) return ;
23
+
24
+ chartObserver = new IntersectionObserver ( ( entries ) => {
25
+ entries . forEach ( entry => {
26
+ if ( entry . isIntersecting ) {
27
+ const containerId = entry . target . querySelector ( 'canvas' ) . id ;
28
+ if ( pendingCharts . has ( containerId ) ) {
29
+ const { data, type } = pendingCharts . get ( containerId ) ;
30
+ createChart ( data , containerId , type ) ;
31
+ pendingCharts . delete ( containerId ) ;
32
+ chartObserver . unobserve ( entry . target ) ;
33
+ }
34
+ }
35
+ } ) ;
36
+ } , {
37
+ root : null , // viewport (current view)
38
+ rootMargin : '100px' , // Load charts a bit before they enter the viewport
39
+ threshold : 0.1 // Start loading when 10% of the chart is within the rootMargin
40
+ } ) ;
41
+ }
42
+
18
43
const colorPalette = [
19
44
'rgb(255, 50, 80)' ,
20
45
'rgb(255, 145, 15)' ,
@@ -230,29 +255,35 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer
230
255
document . querySelectorAll ( '.charts' ) . forEach ( container => container . innerHTML = '' ) ;
231
256
chartInstances . forEach ( chart => chart . destroy ( ) ) ;
232
257
chartInstances . clear ( ) ;
258
+ pendingCharts . clear ( ) ;
259
+
260
+ initChartObserver ( ) ; // For lazy loading charts
233
261
234
262
// Create timeseries charts
235
263
filteredTimeseriesData . forEach ( ( data , index ) => {
236
264
const containerId = `timeseries-${ index } ` ;
237
265
const container = createChartContainer ( data , containerId , 'benchmark' ) ;
238
266
document . querySelector ( '.timeseries .charts' ) . appendChild ( container ) ;
239
- createChart ( data , containerId , 'time' ) ;
267
+ pendingCharts . set ( containerId , { data, type : 'time' } ) ;
268
+ chartObserver . observe ( container ) ;
240
269
} ) ;
241
270
242
271
// Create layer comparison charts
243
272
filteredLayerComparisonsData . forEach ( ( data , index ) => {
244
273
const containerId = `layer-comparison-${ index } ` ;
245
274
const container = createChartContainer ( data , containerId , 'group' ) ;
246
275
document . querySelector ( '.layer-comparisons .charts' ) . appendChild ( container ) ;
247
- createChart ( data , containerId , 'time' ) ;
276
+ pendingCharts . set ( containerId , { data, type : 'time' } ) ;
277
+ chartObserver . observe ( container ) ;
248
278
} ) ;
249
279
250
280
// Create bar charts
251
281
filteredBarChartsData . forEach ( ( data , index ) => {
252
282
const containerId = `barchart-${ index } ` ;
253
283
const container = createChartContainer ( data , containerId , 'group' ) ;
254
284
document . querySelector ( '.bar-charts .charts' ) . appendChild ( container ) ;
255
- createChart ( data , containerId , 'bar' ) ;
285
+ pendingCharts . set ( containerId , { data, type : 'bar' } ) ;
286
+ chartObserver . observe ( container ) ;
256
287
} ) ;
257
288
258
289
// Apply current filters
0 commit comments