Skip to content

Commit ae038ba

Browse files
committed
fix(RHINENG-20701): fir utc timestamps in chart tooltips
1 parent 8cb6726 commit ae038ba

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

web/src/components/Incidents/AlertsChart/AlertsChart.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ import { MonitoringState } from '../../../reducers/observe';
2828
import { IncidentsTooltip } from '../IncidentsTooltip';
2929
import {
3030
createAlertsChartBars,
31-
formatDate,
3231
generateDateArray,
3332
generateAlertsDateArray,
33+
useLanguageFromStorage,
3434
} from '../utils';
35+
import { dateTimeFormatter } from '../../console/utils/datetime';
3536

3637
const AlertsChart = ({ theme }: { theme: 'light' | 'dark' }) => {
3738
const dispatch = useDispatch();
@@ -49,6 +50,7 @@ const AlertsChart = ({ theme }: { theme: 'light' | 'dark' }) => {
4950
const incidentGroupId = useSelector((state: MonitoringState) =>
5051
state.plugins.mcp.getIn(['incidentsData', 'groupId']),
5152
);
53+
const lang = useLanguageFromStorage();
5254

5355
// Use dynamic date range based on actual alerts data instead of fixed chartDays
5456
const dateValues = useMemo(() => {
@@ -118,15 +120,18 @@ const AlertsChart = ({ theme }: { theme: 'light' | 'dark' }) => {
118120
if (datum.nodata) {
119121
return null;
120122
}
123+
const startDate = dateTimeFormatter(lang).format(new Date(datum.y0));
124+
const endDate =
125+
datum.alertstate === 'firing'
126+
? '---'
127+
: dateTimeFormatter(lang).format(new Date(datum.y));
121128
return `Alert Severity: ${datum.severity}
122129
Alert Name: ${datum.name ? datum.name : '---'}
123130
Namespace: ${datum.namespace ? datum.namespace : '---'}
124131
Layer: ${datum.layer ? datum.layer : '---'}
125132
Component: ${datum.component}
126-
Start: ${formatDate(new Date(datum.y0), true)}
127-
End: ${
128-
datum.alertstate === 'firing' ? '---' : formatDate(new Date(datum.y), true)
129-
}`;
133+
Start: ${startDate}
134+
End: ${endDate}`;
130135
}}
131136
/>
132137
}

web/src/components/Incidents/IncidentsChart/IncidentsChart.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ import { IncidentsTooltip } from '../IncidentsTooltip';
3131
import { Incident } from '../model';
3232
import {
3333
createIncidentsChartBars,
34-
formatDate,
3534
generateDateArray,
3635
updateBrowserUrl,
36+
useLanguageFromStorage,
3737
} from '../utils';
38+
import { dateTimeFormatter } from '../../console/utils/datetime';
3839

3940
const IncidentsChart = ({
4041
incidentsData,
@@ -55,6 +56,7 @@ const IncidentsChart = ({
5556
state.plugins.mcp.getIn(['incidentsData', 'incidentsActiveFilters']),
5657
);
5758
const selectedGroupId = incidentsActiveFilters.groupId?.[0] ?? null;
59+
const lang = useLanguageFromStorage();
5860

5961
const chartData = useMemo(() => {
6062
if (!Array.isArray(incidentsData) || incidentsData.length === 0) return [];
@@ -137,12 +139,17 @@ const IncidentsChart = ({
137139
if (datum.nodata) {
138140
return null;
139141
}
142+
const startDate = dateTimeFormatter(lang).format(new Date(datum.y0));
143+
const endDate =
144+
datum.alertstate === 'firing'
145+
? '---'
146+
: dateTimeFormatter(lang).format(new Date(datum.y));
140147
return `Severity: ${datum.name}
141148
Component: ${datum.componentList?.join(', ')}
142149
Incident ID:
143150
${datum.group_id}
144-
Start: ${formatDate(new Date(datum.y0), true)}
145-
End: ${datum.firing ? '---' : formatDate(new Date(datum.y), true)}`;
151+
Start: ${startDate}
152+
End: ${endDate}`;
146153
}}
147154
/>
148155
}

web/src/components/Incidents/utils.ts

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
SpanDates,
1717
Timestamps,
1818
} from './model';
19+
import { useState, useEffect } from 'react';
1920

2021
function consolidateAndMergeIntervals(data: Incident, dateArray: SpanDates) {
2122
const severityRank = { 2: 2, 1: 1, 0: 0 };
@@ -236,20 +237,6 @@ export const createAlertsChartBars = (alert: Alert) => {
236237
return data;
237238
};
238239

239-
export const formatDate = (date: Date, isTime: boolean) => {
240-
const userLocale = navigator.language || 'en-US';
241-
const dateString = date?.toLocaleDateString(userLocale, {
242-
day: 'numeric',
243-
month: 'short',
244-
year: 'numeric',
245-
});
246-
const timeString = date?.toLocaleTimeString(userLocale, {
247-
hour: '2-digit',
248-
minute: '2-digit',
249-
});
250-
return isTime ? `${dateString}, ${timeString}` : dateString;
251-
};
252-
253240
/**
254241
* Generates an array of dates, each representing midnight (00:00:00) of the past `days` number of days, starting from today.
255242
*
@@ -702,3 +689,26 @@ export const getFilterKey = (categoryName: string): string => {
702689
}
703690
return categoryName.toLowerCase();
704691
};
692+
693+
const LAST_LANGUAGE_LOCAL_STORAGE_KEY = 'bridge/last-language';
694+
695+
export const getLastLanguage = (): string =>
696+
localStorage.getItem(LAST_LANGUAGE_LOCAL_STORAGE_KEY) || navigator.language || 'en-US';
697+
698+
export const useLanguageFromStorage = () => {
699+
const [lang, setLang] = useState(getLastLanguage());
700+
701+
useEffect(() => {
702+
const handleStorageChange = (e: StorageEvent) => {
703+
if (e.key === LAST_LANGUAGE_LOCAL_STORAGE_KEY) {
704+
setLang(e.newValue || getLastLanguage());
705+
}
706+
};
707+
window.addEventListener('storage', handleStorageChange);
708+
return () => {
709+
window.removeEventListener('storage', handleStorageChange);
710+
};
711+
}, []);
712+
713+
return lang;
714+
};

0 commit comments

Comments
 (0)