mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import type React from 'react';
|
|
import styled from '@emotion/styled';
|
|
|
|
import CircleIndicator from 'sentry/components/circleIndicator';
|
|
import {Hovercard} from 'sentry/components/hovercard';
|
|
import {t} from 'sentry/locale';
|
|
import {space} from 'sentry/styles/space';
|
|
import type {TableDataWithTitle} from 'sentry/utils/discover/discoverQuery';
|
|
import theme from 'sentry/utils/theme';
|
|
|
|
import type {ThresholdsConfig} from './thresholdsStep';
|
|
|
|
type Props = {
|
|
children: React.ReactNode;
|
|
tableData: TableDataWithTitle[];
|
|
thresholds: ThresholdsConfig;
|
|
};
|
|
|
|
function ThresholdsHoverWrapper({children, thresholds, tableData}: Props) {
|
|
const {
|
|
unit,
|
|
max_values: {max1, max2},
|
|
} = thresholds;
|
|
const tableMeta = {...tableData[0].meta};
|
|
const fields = Object.keys(tableMeta);
|
|
const field = fields[0];
|
|
const dataType = tableMeta[field];
|
|
const formattedUnit =
|
|
unit && (dataType === 'duration' ? `${unit}s` : `/${unit.split('/')[1]}`);
|
|
const title = unit ? t(`Thresholds in %s`, formattedUnit) : t('Thresholds');
|
|
|
|
const notSetMsg = t('Not set');
|
|
const maxOneValue = max1 ?? notSetMsg;
|
|
const maxTwoValue = max2 ?? notSetMsg;
|
|
|
|
return (
|
|
<StyledHoverCard
|
|
skipWrapper
|
|
body={
|
|
<BodyWrapper>
|
|
<ContextTitle>{title}</ContextTitle>
|
|
<Row>
|
|
<StyledIndicator color={theme.green300} size={10} />
|
|
<span>0 - {maxOneValue}</span>
|
|
</Row>
|
|
<Row>
|
|
<StyledIndicator color={theme.yellow300} size={10} />
|
|
<span>
|
|
{maxOneValue} - {maxTwoValue}
|
|
</span>
|
|
</Row>
|
|
<Row>
|
|
<StyledIndicator color={theme.red300} size={10} />
|
|
<span>
|
|
{maxTwoValue} - {t('No max')}
|
|
</span>
|
|
</Row>
|
|
</BodyWrapper>
|
|
}
|
|
>
|
|
{children}
|
|
</StyledHoverCard>
|
|
);
|
|
}
|
|
|
|
const StyledHoverCard = styled(Hovercard)`
|
|
width: fit-content;
|
|
`;
|
|
|
|
const BodyWrapper = styled('div')`
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: ${space(1)};
|
|
`;
|
|
|
|
const Row = styled('span')`
|
|
display: flex;
|
|
gap: ${space(0.5)};
|
|
align-items: center;
|
|
`;
|
|
|
|
const ContextTitle = styled('h6')`
|
|
color: ${p => p.theme.subText};
|
|
margin-bottom: 0 !important;
|
|
`;
|
|
|
|
const StyledIndicator = styled(CircleIndicator)`
|
|
margin-right: ${space(1)};
|
|
`;
|
|
|
|
export default ThresholdsHoverWrapper;
|