@@ -171,7 +171,7 @@ export const createIncidentsChartBars = (incident: Incident, dateArray: SpanDate
171171 return data ;
172172} ;
173173
174- function consolidateAndMergeAlertIntervals ( data : Alert , dateArray : SpanDates ) {
174+ function consolidateAndMergeAlertIntervals ( data : Alert ) {
175175 if ( ! data . values || data . values . length === 0 ) {
176176 return [ ] ;
177177 }
@@ -195,24 +195,15 @@ function consolidateAndMergeAlertIntervals(data: Alert, dateArray: SpanDates) {
195195
196196 intervals . push ( [ currentStart , sortedValues [ sortedValues . length - 1 ] [ 0 ] , 'data' ] ) ;
197197
198- // Handle gaps before and after the detected intervals
199- const startBoundary = dateArray [ 0 ] ,
200- endBoundary = dateArray [ dateArray . length - 1 ] ;
201- const firstIntervalStart = intervals [ 0 ] [ 0 ] ,
202- lastIntervalEnd = intervals [ intervals . length - 1 ] [ 1 ] ;
203-
204- if ( firstIntervalStart > startBoundary ) {
205- intervals . unshift ( [ startBoundary , firstIntervalStart - 1 , 'nodata' ] ) ;
206- }
207- if ( lastIntervalEnd < endBoundary ) {
208- intervals . push ( [ lastIntervalEnd + 1 , endBoundary , 'nodata' ] ) ;
209- }
198+ // For dynamic alerts timeline, we don't add padding gaps since the dateArray
199+ // is already calculated to fit the alert data with appropriate padding
200+ // This allows the timeline to focus on the actual alert activity period
210201
211202 return intervals ;
212203}
213204
214- export const createAlertsChartBars = ( alert : Alert , dateValues : SpanDates ) => {
215- const groupedData = consolidateAndMergeAlertIntervals ( alert , dateValues ) ;
205+ export const createAlertsChartBars = ( alert : Alert ) => {
206+ const groupedData = consolidateAndMergeAlertIntervals ( alert ) ;
216207 const barChartColorScheme = {
217208 critical : t_global_color_status_danger_default . var ,
218209 info : t_global_color_status_info_default . var ,
@@ -298,6 +289,63 @@ export function generateDateArray(days: number): Array<number> {
298289 return dateArray ;
299290}
300291
292+ /**
293+ * Generates a dynamic date array based on the actual min/max timestamps from alerts data.
294+ * This creates a focused timeline that spans only the relevant alert activity period.
295+ *
296+ * @param {Array<Alert> } alertsData - Array of alert objects containing timestamp values
297+ * @returns {Array<number> } - Array of timestamp values representing the date range with some padding
298+ *
299+ * @example
300+ * const alertsDateRange = generateAlertsDateArray(alertsData);
301+ * // Returns timestamps spanning from earliest alert minus padding to latest alert plus padding
302+ */
303+ export function generateAlertsDateArray ( alertsData : Array < Alert > ) : Array < number > {
304+ if ( ! Array . isArray ( alertsData ) || alertsData . length === 0 ) {
305+ // Fallback to current day if no alerts data
306+ const now = new Date ( ) ;
307+ now . setHours ( 0 , 0 , 0 , 0 ) ;
308+ return [ now . getTime ( ) / 1000 ] ;
309+ }
310+
311+ let minTimestamp = Infinity ;
312+ let maxTimestamp = - Infinity ;
313+
314+ // Find min and max timestamps across all alerts
315+ alertsData . forEach ( ( alert ) => {
316+ if ( alert . values && Array . isArray ( alert . values ) ) {
317+ alert . values . forEach ( ( [ timestamp ] ) => {
318+ minTimestamp = Math . min ( minTimestamp , timestamp ) ;
319+ maxTimestamp = Math . max ( maxTimestamp , timestamp ) ;
320+ } ) ;
321+ }
322+ } ) ;
323+
324+ // Handle edge case where no valid timestamps found
325+ if ( minTimestamp === Infinity || maxTimestamp === - Infinity ) {
326+ const now = new Date ( ) ;
327+ now . setHours ( 0 , 0 , 0 , 0 ) ;
328+ return [ now . getTime ( ) / 1000 ] ;
329+ }
330+
331+ // Add some padding to make the timeline more readable
332+ // Padding: 10% of the time span, minimum 1 hour, maximum 24 hours
333+ const timeSpan = maxTimestamp - minTimestamp ;
334+ const paddingSeconds = Math . max ( 3600 , Math . min ( 86400 , timeSpan * 0.1 ) ) ;
335+
336+ const paddedMin = minTimestamp - paddingSeconds ;
337+ const paddedMax = maxTimestamp + paddingSeconds ;
338+
339+ // Generate array with exactly 2 timestamps: min (start) and max (end)
340+ const dateArray : Array < number > = [ ] ;
341+
342+ // Always show exactly 2 ticks for clean X-axis: start and end only
343+ dateArray . push ( paddedMin ) ; // Min date (start)
344+ dateArray . push ( paddedMax ) ; // Max date (end)
345+
346+ return dateArray ;
347+ }
348+
301349/**
302350 * Filters incidents based on the specified filters.
303351 *
0 commit comments