Files
2024-02-15 17:01:50 +00:00

93 lines
2.5 KiB
TypeScript

import moment from 'moment';
import type BaseChart from 'sentry/components/charts/baseChart';
import type {DateTimeObject} from 'sentry/components/charts/utils';
import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
import type {SeriesDataUnit} from 'sentry/types/echarts';
/**
* Buckets a week of sequential days into one data unit
*/
export function sortSeriesByDay(data: SeriesDataUnit[]): SeriesDataUnit[] {
return data.sort((a, b) => new Date(a.name).getTime() - new Date(b.name).getTime());
}
/**
* Convert an object with date as the key to a series
*/
export function convertDayValueObjectToSeries(
data: Record<string, number>
): SeriesDataUnit[] {
return Object.entries(data).map(([bucket, count]) => ({
value: count,
name: new Date(bucket).getTime(),
}));
}
/**
* Takes a sorted array of trend items and groups them by worst/better/no chagne
*/
export function groupByTrend<T extends {trend: number}>(data: T[]): T[] {
const worseItems = data.filter(x => Math.round(x.trend) < 0);
const betterItems = data.filter(x => Math.round(x.trend) > 0);
const zeroItems = data.filter(x => Math.round(x.trend) === 0);
return [...worseItems, ...betterItems, ...zeroItems];
}
export const barAxisLabel = (): React.ComponentProps<typeof BaseChart>['xAxis'] => {
return {
type: 'category',
axisTick: {
alignWithLabel: true,
},
axisLabel: {
formatter: (date: string) => {
return moment(new Date(Number(date))).format('MMM D');
},
},
};
};
const INSIGHTS_DEFAULT_STATS_PERIOD = '8w';
export function dataDatetime(
query: Parameters<typeof normalizeDateTimeParams>[0]
): DateTimeObject {
const {
start,
end,
statsPeriod,
utc: utcString,
} = normalizeDateTimeParams(query, {
allowEmptyPeriod: true,
allowAbsoluteDatetime: true,
allowAbsolutePageDatetime: true,
});
if (!statsPeriod && !start && !end) {
return {period: INSIGHTS_DEFAULT_STATS_PERIOD};
}
// Following getParams, statsPeriod will take priority over start/end
if (statsPeriod) {
return {period: statsPeriod};
}
const utc = utcString === 'true';
if (start && end) {
return utc
? {
start: moment.utc(start).format(),
end: moment.utc(end).format(),
utc,
}
: {
start: moment(start).utc().format(),
end: moment(end).utc().format(),
utc,
};
}
return {period: INSIGHTS_DEFAULT_STATS_PERIOD};
}