Skip to content

Commit a7350ac

Browse files
committed
fix: make ui convert range static dates to rfc3339
1 parent e1cb845 commit a7350ac

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed

ui/src/dashboard/Entry/AddPopup.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as gqlDashboard from '../../gql/dashboard';
1010
import {Fade} from '../../common/Fade';
1111
import {DashboardEntryForm, isValidDashboardEntry} from './DashboardEntryForm';
1212
import {AddDashboardEntry, AddDashboardEntryVariables} from '../../gql/__generated__/AddDashboardEntry';
13+
import {normalizeRangeDateFormat} from '../../utils/range';
1314

1415
interface EditPopupProps {
1516
dashboardId: number;
@@ -83,10 +84,10 @@ export const AddPopup: React.FC<EditPopupProps> = ({
8384
tags: entry.statsSelection.tags,
8485
interval: entry.statsSelection.interval,
8586
range: entry.statsSelection.range
86-
? {
87+
? normalizeRangeDateFormat({
8788
from: entry.statsSelection.range.from,
8889
to: entry.statsSelection.range.to,
89-
}
90+
})
9091
: null,
9192
rangeId: entry.statsSelection.rangeId,
9293
},

ui/src/dashboard/Entry/DashboardEntry.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {DashboardBarChart} from './DashboardBarChart';
1414
import {DashboardLineChart} from './DashboardLineChart';
1515
import {CenteredSpinner} from '../../common/CenteredSpinner';
1616
import {Center} from '../../common/Center';
17-
import {findRange, Range} from '../../utils/range';
17+
import {findRange, normalizeRangeDateFormat, Range} from '../../utils/range';
1818
import {DashboardTable} from './DashboardTable';
1919

2020
interface DashboardEntryProps {
@@ -43,13 +43,14 @@ export const DashboardEntry: React.FC<DashboardEntryProps> = React.forwardRef<{}
4343
// tslint:disable-next-line:cyclomatic-complexity mccabe-complexity
4444
const SpecificDashboardEntry: React.FC<{entry: Dashboards_dashboards_items; range: Range}> = ({entry, range}) => {
4545
const interval = entry.statsSelection.interval;
46+
const normalizedRange = normalizeRangeDateFormat(range);
4647
const stats = useQuery<Stats2, Stats2Variables>(gqlStats.Stats2, {
4748
variables: {
4849
now: moment()
4950
.startOf('hour')
5051
.format(),
5152
stats: {
52-
range,
53+
range: normalizedRange,
5354
interval,
5455
tags: entry.statsSelection.tags,
5556
},

ui/src/dashboard/Entry/EditPopup.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as gqlDashboard from '../../gql/dashboard';
1010
import {UpdateDashboardEntry, UpdateDashboardEntryVariables} from '../../gql/__generated__/UpdateDashboardEntry';
1111
import {Fade} from '../../common/Fade';
1212
import {DashboardEntryForm, isValidDashboardEntry} from './DashboardEntryForm';
13+
import {normalizeRangeDateFormat} from '../../utils/range';
1314

1415
interface EditPopupProps {
1516
entry: Dashboards_dashboards_items;
@@ -69,10 +70,10 @@ export const EditPopup: React.FC<EditPopupProps> = ({entry, anchorEl, onChange:
6970
tags: entry.statsSelection.tags,
7071
interval: entry.statsSelection.interval,
7172
range: entry.statsSelection.range
72-
? {
73+
? normalizeRangeDateFormat({
7374
from: entry.statsSelection.range.from,
7475
to: entry.statsSelection.range.to,
75-
}
76+
})
7677
: null,
7778
rangeId: entry.statsSelection.rangeId,
7879
},

ui/src/utils/range.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {normalizeDate} from './range';
2+
import moment from 'moment';
3+
4+
moment.updateLocale('en', {
5+
week: {
6+
dow: 1, // monday
7+
doy: moment.localeData('en').firstDayOfYear(),
8+
},
9+
});
10+
moment.tz.setDefault('UTC');
11+
12+
it('should convert to RFC3339', () => {
13+
expect(normalizeDate('2025-01-01 10:10')).toBe('2025-01-01T10:10:00Z');
14+
});
15+
16+
it('should not modify relative ranges', () => {
17+
expect(normalizeDate('now-1d')).toBe('now-1d');
18+
expect(normalizeDate('now-120s')).toBe('now-120s');
19+
expect(normalizeDate('now-1d-1h')).toBe('now-1d-1h');
20+
expect(normalizeDate('now/w')).toBe('now/w');
21+
expect(normalizeDate('now/w')).toBe('now/w');
22+
expect(normalizeDate('now-1w/w')).toBe('now-1w/w');
23+
expect(normalizeDate('now-1y+1w/w')).toBe('now-1y+1w/w');
24+
expect(normalizeDate('now/d+5h')).toBe('now/d+5h');
25+
expect(normalizeDate('now/y')).toBe('now/y');
26+
});

ui/src/utils/range.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import moment from 'moment-timezone';
2+
13
export interface Range {
24
from: string;
35
to: string;
@@ -14,3 +16,16 @@ export const findRange = (selection: {range: Range | null; rangeId: number | nul
1416
};
1517

1618
export const exclusiveRange = (range: Range) => ({from: range.from, to: range.to});
19+
20+
export function normalizeDate(date: string): string {
21+
const d = moment(date);
22+
if (d.isValid()) {
23+
return d.utc().format();
24+
} else {
25+
return date;
26+
}
27+
}
28+
29+
export function normalizeRangeDateFormat(range: Range): Range {
30+
return {from: normalizeDate(range.from), to: normalizeDate(range.to)};
31+
}

0 commit comments

Comments
 (0)