Files
grafana/public/app/features/alerting/unified/components/DynamicTableWithGuidelines.tsx
Nathan Rodman a0dac9c6d9 Alerting: Add alertmanager notifications tab (#35759)
* Add alertmanager notifications tab

* Link to silences page from am alert

* Include summary for alertmanager group

* Fix colors for am state

* Add horizontal dividing line

* PR feedback

* Add basic unit test for alert notificaitons

* Rename Notificaitons component file

* Polling interval to groups

* Add alertmanager notifications tab

* Link to silences page from am alert

* Include summary for alertmanager group

* PR feedback

* Add basic unit test for alert notificaitons

* Rename Notificaitons component file

* Alerting: make alertmanager notifications view responsive (#36067)

* refac DynamicTableWithGuidelines

* more responsiveness fixes

* Add more to tests

* Add loading and alert state for notifications

Co-authored-by: Domas <domas.lapinskas@grafana.com>
2021-07-07 16:17:26 -07:00

77 lines
2.1 KiB
TypeScript

import { css, cx } from '@emotion/css';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
import React from 'react';
import { DynamicTable, DynamicTableProps } from './DynamicTable';
export type DynamicTableWithGuidelinesProps<T> = Omit<DynamicTableProps<T>, 'renderPrefixHeader, renderPrefixCell'>;
// DynamicTable, but renders visual guidelines on the left, for larger screen widths
export const DynamicTableWithGuidelines = <T extends object>({
renderExpandedContent,
...props
}: DynamicTableWithGuidelinesProps<T>) => {
const styles = useStyles2(getStyles);
return (
<DynamicTable
renderExpandedContent={
renderExpandedContent
? (item, index, items) => (
<>
{!(index === items.length - 1) && <div className={cx(styles.contentGuideline, styles.guideline)} />}
{renderExpandedContent(item, index, items)}
</>
)
: undefined
}
renderPrefixHeader={() => (
<div className={styles.relative}>
<div className={cx(styles.headerGuideline, styles.guideline)} />
</div>
)}
renderPrefixCell={(_, index, items) => (
<div className={styles.relative}>
<div className={cx(styles.topGuideline, styles.guideline)} />
{!(index === items.length - 1) && <div className={cx(styles.bottomGuideline, styles.guideline)} />}
</div>
)}
{...props}
/>
);
};
export const getStyles = (theme: GrafanaTheme2) => ({
relative: css`
position: relative;
height: 100%;
`,
guideline: css`
left: -19px;
border-left: 1px solid ${theme.colors.border.medium};
position: absolute;
${theme.breakpoints.down('md')} {
display: none;
}
`,
topGuideline: css`
width: 18px;
border-bottom: 1px solid ${theme.colors.border.medium};
top: 0;
bottom: 50%;
`,
bottomGuideline: css`
top: 50%;
bottom: 0;
`,
contentGuideline: css`
top: 0;
bottom: 0;
left: -49px !important;
`,
headerGuideline: css`
top: -25px;
bottom: 0;
`,
});