grafana/public/app/features/alerting/unified/components/receivers/TemplateDataDocs.tsx
Konrad Lalik 4c4b758646
Alerting: Add templates autocomplete (#53655)
Co-authored-by: brendamuir <100768211+brendamuir@users.noreply.github.com>
2022-09-20 13:07:17 +02:00

165 lines
3.9 KiB
TypeScript

import { css } from '@emotion/css';
import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Stack, useStyles2 } from '@grafana/ui';
import { HoverCard } from '../HoverCard';
import {
AlertTemplateData,
GlobalTemplateData,
KeyValueCodeSnippet,
KeyValueTemplateFunctions,
TemplateDataItem,
} from './TemplateData';
export function TemplateDataDocs() {
const styles = useStyles2(getTemplateDataDocsStyles);
const AlertTemplateDataTable = (
<TemplateDataTable
caption={
<h4 className={styles.header}>
Alert template data <span>Available only when in the context of an Alert (e.g. inside .Alerts loop)</span>
</h4>
}
dataItems={AlertTemplateData}
/>
);
return (
<Stack gap={2} flexGrow={1}>
<TemplateDataTable
caption={<h4 className={styles.header}>Template Data</h4>}
dataItems={GlobalTemplateData}
typeRenderer={(type) =>
type === '[]Alert' ? (
<HoverCard content={AlertTemplateDataTable}>
<div className={styles.interactiveType}>{type}</div>
</HoverCard>
) : type === 'KeyValue' ? (
<HoverCard content={<KeyValueTemplateDataTable />}>
<div className={styles.interactiveType}>{type}</div>
</HoverCard>
) : (
type
)
}
/>
</Stack>
);
}
const getTemplateDataDocsStyles = (theme: GrafanaTheme2) => ({
header: css`
color: ${theme.colors.text.primary};
span {
color: ${theme.colors.text.secondary};
font-size: ${theme.typography.bodySmall.fontSize};
}
`,
interactiveType: css`
color: ${theme.colors.text.link};
`,
});
interface TemplateDataTableProps {
dataItems: TemplateDataItem[];
caption: JSX.Element | string;
typeRenderer?: (type: TemplateDataItem['type']) => React.ReactNode;
}
function TemplateDataTable({ dataItems, caption, typeRenderer }: TemplateDataTableProps) {
const styles = useStyles2(getTemplateDataTableStyles);
return (
<table className={styles.table}>
<caption>{caption}</caption>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{dataItems.map(({ name, type, notes }, index) => (
<tr key={index}>
<td>{name}</td>
<td>{typeRenderer ? typeRenderer(type) : type}</td>
<td>{notes}</td>
</tr>
))}
</tbody>
</table>
);
}
function KeyValueTemplateDataTable() {
const tableStyles = useStyles2(getTemplateDataTableStyles);
return (
<div>
KeyValue is a set of key/value string pairs that represent labels and annotations.
<pre>
<code>{KeyValueCodeSnippet}</code>
</pre>
<table className={tableStyles.table}>
<caption>Key-value methods</caption>
<thead>
<tr>
<th>Name</th>
<th>Arguments</th>
<th>Returns</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{KeyValueTemplateFunctions.map(({ name, args, returns, notes }) => (
<tr key={name}>
<td>{name}</td>
<td>{args}</td>
<td>{returns}</td>
<td>{notes}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
const getTemplateDataTableStyles = (theme: GrafanaTheme2) => ({
table: css`
border-collapse: collapse;
width: 100%;
caption {
caption-side: top;
}
td,
th {
padding: ${theme.spacing(1, 1)};
}
thead {
font-weight: ${theme.typography.fontWeightBold};
}
tbody tr:nth-child(2n + 1) {
background-color: ${theme.colors.background.secondary};
}
tbody td:nth-child(1) {
font-weight: ${theme.typography.fontWeightBold};
}
tbody td:nth-child(2) {
font-style: italic;
}
`,
});