@@ -133,6 +133,7 @@ const TableMonitoringTrend = (props) => {
133133 if ( volumeRange . min === volumeRange . max ) {
134134 volumeRange . max = volumeRange . max + 100 ;
135135 }
136+ const tickDecimals = ( value , range ) => ( range . max - range . min ) < 1 ? 3 : ( value >= 1000 ? 0 : 3 ) ;
136137
137138 const metricRanges = metricEventGroups . map ( group => {
138139 const predictionKey = `metric:${ group . test_definition_id } ` ;
@@ -193,11 +194,50 @@ const TableMonitoringTrend = (props) => {
193194
194195 const rawTimeline = [ ...new Set ( allTimes ) ] . sort ( ) ;
195196 const dateRange = { min : rawTimeline [ 0 ] ?? ( new Date ( ) ) . getTime ( ) , max : rawTimeline [ rawTimeline . length - 1 ] ?? ( new Date ( ) ) . getTime ( ) + 1 * 24 * 60 * 60 * 1000 } ;
196- const timeline = ( [
197- new Date ( dateRange . min ) ,
198- ...getAdaptiveTimeTicksV2 ( rawTimeline . slice ( 2 , rawTimeline . length - 2 ) . map ( time => new Date ( time ) ) , chartsWidth , tickWidth ) ,
199- new Date ( dateRange . max ) ,
200- ] ) . filter ( ( t ) => ! ! t ) ;
197+ const toPixelX = ( date ) => scale ( date . getTime ( ) , { old : dateRange , new : { min : origin . x , max : end . x } } , origin . x ) ;
198+ const xTickMinSpacing = 65 ;
199+ const timeline = ( ( ) => {
200+ const adaptiveTicks = getAdaptiveTimeTicksV2 (
201+ rawTimeline . map ( time => new Date ( time ) ) ,
202+ end . x - origin . x ,
203+ xTickMinSpacing ,
204+ ) ;
205+
206+ const seen = new Set ( ) ;
207+ const candidates = [ ] ;
208+ for ( const date of [ new Date ( dateRange . min ) , ...adaptiveTicks , new Date ( dateRange . max ) ] ) {
209+ if ( ! date ) continue ;
210+ const t = date . getTime ( ) ;
211+ if ( ! seen . has ( t ) ) {
212+ seen . add ( t ) ;
213+ candidates . push ( date ) ;
214+ }
215+ }
216+ candidates . sort ( ( a , b ) => a . getTime ( ) - b . getTime ( ) ) ;
217+
218+ if ( candidates . length <= 2 ) return candidates ;
219+
220+ const first = candidates [ 0 ] ;
221+ const last = candidates [ candidates . length - 1 ] ;
222+ const firstPx = toPixelX ( first ) ;
223+ const lastPx = toPixelX ( last ) ;
224+
225+ if ( lastPx - firstPx < xTickMinSpacing ) return [ first ] ;
226+
227+ const result = [ first ] ;
228+ let prevPx = firstPx ;
229+
230+ for ( let i = 1 ; i < candidates . length - 1 ; i ++ ) {
231+ const px = toPixelX ( candidates [ i ] ) ;
232+ if ( px - prevPx >= xTickMinSpacing && lastPx - px >= xTickMinSpacing ) {
233+ result . push ( candidates [ i ] ) ;
234+ prevPx = px ;
235+ }
236+ }
237+
238+ result . push ( last ) ;
239+ return result ;
240+ } ) ( ) ;
201241
202242 const parsedFreshnessEvents = freshnessEvents . map ( ( e ) => ( {
203243 changed : e . changed ,
@@ -549,8 +589,8 @@ const TableMonitoringTrend = (props) => {
549589 // Volume Chart Y axis
550590 g (
551591 { transform : `translate(${ chartsYAxisWidth - 4 } , ${ positionTracking . volumeTrendChart + ( volumeTrendChartHeight / 2 ) } )` } ,
552- text ( { x : 0 , y : 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( volumeRange . min ) ) ,
553- text ( { x : 0 , y : - 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( volumeRange . max ) ) ,
592+ text ( { x : 0 , y : 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( volumeRange . min , tickDecimals ( volumeRange . min , volumeRange ) ) ) ,
593+ text ( { x : 0 , y : - 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( volumeRange . max , tickDecimals ( volumeRange . max , volumeRange ) ) ) ,
554594 ) ,
555595
556596 // Schema Chart Y axis
@@ -565,8 +605,8 @@ const TableMonitoringTrend = (props) => {
565605 const chartName = `metricTrendChart_${ idx } ` ;
566606 return g (
567607 { transform : `translate(${ chartsYAxisWidth - 4 } , ${ positionTracking [ chartName ] + ( metricTrendChartHeight / 2 ) } )` } ,
568- text ( { x : 0 , y : 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( metricChart . range . min ) ) ,
569- text ( { x : 0 , y : - 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( metricChart . range . max ) ) ,
608+ text ( { x : 0 , y : 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( metricChart . range . min , tickDecimals ( metricChart . range . min , metricChart . range ) ) ) ,
609+ text ( { x : 0 , y : - 35 , class : 'tick-text' , 'text-anchor' : 'end' , fill : 'var(--caption-text-color)' } , formatNumber ( metricChart . range . max , tickDecimals ( metricChart . range . max , metricChart . range ) ) ) ,
570610 ) ;
571611 } ) ,
572612 ) ,
0 commit comments