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