mirror of
https://github.com/grafana/grafana.git
synced 2025-09-20 04:14:27 +08:00
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import { css } from '@emotion/css';
|
|
import React, { useMemo } from 'react';
|
|
|
|
import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';
|
|
import { useStyles2 } from '@grafana/ui';
|
|
import { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';
|
|
|
|
import { AlertLabels } from '../AlertLabels';
|
|
import { DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';
|
|
import { DynamicTableWithGuidelines } from '../DynamicTableWithGuidelines';
|
|
import { AmAlertStateTag } from '../silences/AmAlertStateTag';
|
|
|
|
import { AlertDetails } from './AlertDetails';
|
|
|
|
interface Props {
|
|
alerts: AlertmanagerAlert[];
|
|
alertManagerSourceName: string;
|
|
}
|
|
|
|
type AlertGroupAlertsTableColumnProps = DynamicTableColumnProps<AlertmanagerAlert>;
|
|
type AlertGroupAlertsTableItemProps = DynamicTableItemProps<AlertmanagerAlert>;
|
|
|
|
export const AlertGroupAlertsTable = ({ alerts, alertManagerSourceName }: Props) => {
|
|
const styles = useStyles2(getStyles);
|
|
|
|
const columns = useMemo(
|
|
(): AlertGroupAlertsTableColumnProps[] => [
|
|
{
|
|
id: 'state',
|
|
label: 'State',
|
|
// eslint-disable-next-line react/display-name
|
|
renderCell: ({ data: alert }) => (
|
|
<>
|
|
<AmAlertStateTag state={alert.status.state} />
|
|
<span className={styles.duration}>
|
|
for{' '}
|
|
{intervalToAbbreviatedDurationString({
|
|
start: new Date(alert.startsAt),
|
|
end: new Date(alert.endsAt),
|
|
})}
|
|
</span>
|
|
</>
|
|
),
|
|
size: '220px',
|
|
},
|
|
{
|
|
id: 'labels',
|
|
label: 'Labels',
|
|
// eslint-disable-next-line react/display-name
|
|
renderCell: ({ data: { labels } }) => <AlertLabels labels={labels} />,
|
|
size: 1,
|
|
},
|
|
],
|
|
[styles]
|
|
);
|
|
|
|
const items = useMemo(
|
|
(): AlertGroupAlertsTableItemProps[] =>
|
|
alerts.map((alert) => ({
|
|
id: alert.fingerprint,
|
|
data: alert,
|
|
})),
|
|
[alerts]
|
|
);
|
|
|
|
return (
|
|
<div className={styles.tableWrapper} data-testid="alert-group-table">
|
|
<DynamicTableWithGuidelines
|
|
cols={columns}
|
|
items={items}
|
|
isExpandable={true}
|
|
renderExpandedContent={({ data: alert }) => (
|
|
<AlertDetails alert={alert} alertManagerSourceName={alertManagerSourceName} />
|
|
)}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => ({
|
|
tableWrapper: css`
|
|
margin-top: ${theme.spacing(3)};
|
|
${theme.breakpoints.up('md')} {
|
|
margin-left: ${theme.spacing(4.5)};
|
|
}
|
|
`,
|
|
duration: css`
|
|
margin-left: ${theme.spacing(1)};
|
|
font-size: ${theme.typography.bodySmall.fontSize};
|
|
`,
|
|
});
|