UNPKG

@grafana/ui

Version:
1 lines 8.33 kB
{"version":3,"file":"VizTooltipFooter.mjs","sources":["../../../../src/components/VizTooltip/VizTooltipFooter.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useMemo } from 'react';\n\nimport { ActionModel, Field, GrafanaTheme2, LinkModel, ThemeSpacingTokens } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { ActionButton } from '../Actions/ActionButton';\nimport { Button } from '../Button/Button';\nimport { DataLinkButton } from '../DataLinks/DataLinkButton';\nimport { Icon } from '../Icon/Icon';\nimport { Stack } from '../Layout/Stack/Stack';\nimport { ResponsiveProp } from '../Layout/utils/responsiveness';\n\ninterface VizTooltipFooterProps {\n dataLinks: Array<LinkModel<Field>>;\n actions?: Array<ActionModel<Field>>;\n annotate?: () => void;\n}\n\nexport const ADD_ANNOTATION_ID = 'add-annotation-button';\n\ntype RenderOneClickTrans = (title: string) => React.ReactNode;\ntype RenderItem<T extends LinkModel | ActionModel> = (\n item: T,\n idx: number,\n styles: ReturnType<typeof getStyles>\n) => React.ReactNode;\n\nfunction makeRenderLinksOrActions<T extends LinkModel | ActionModel>(\n renderOneClickTrans: RenderOneClickTrans,\n renderItem: RenderItem<T>,\n itemGap?: ResponsiveProp<ThemeSpacingTokens>\n) {\n const renderLinksOrActions = (items: T[], styles: ReturnType<typeof getStyles>) => {\n if (items.length === 0) {\n return;\n }\n\n const oneClickItem = items.find((item) => item.oneClick === true);\n\n if (oneClickItem != null) {\n return (\n <div className={styles.dataLinks}>\n <Stack direction=\"column\" justifyContent=\"flex-start\" gap={0.5}>\n <span className={styles.oneClickWrapper}>\n <Icon name=\"info-circle\" size=\"lg\" className={styles.infoIcon} />\n {renderOneClickTrans(oneClickItem.title)}\n </span>\n </Stack>\n </div>\n );\n }\n\n return (\n <div className={styles.dataLinks}>\n <Stack direction=\"column\" justifyContent=\"flex-start\" gap={itemGap}>\n {items.map((item, i) => renderItem(item, i, styles))}\n </Stack>\n </div>\n );\n };\n\n return renderLinksOrActions;\n}\n\nconst renderDataLinks = makeRenderLinksOrActions<LinkModel>(\n (title) => (\n <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-click-to-navigate\">Click to open {{ linkTitle: title }}</Trans>\n ),\n (item, i, styles) => (\n <DataLinkButton link={item} key={i} buttonProps={{ className: styles.dataLinkButton, fill: 'text' }} />\n ),\n 0.5\n);\n\nconst renderActions = makeRenderLinksOrActions<ActionModel>(\n (title) => <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-click-to-action\">Click to {{ actionTitle: title }}</Trans>,\n (item, i) => <ActionButton key={i} action={item} variant=\"secondary\" />\n);\n\nexport const VizTooltipFooter = ({ dataLinks, actions = [], annotate }: VizTooltipFooterProps) => {\n const styles = useStyles2(getStyles);\n const hasOneClickLink = useMemo(() => dataLinks.some((link) => link.oneClick === true), [dataLinks]);\n const hasOneClickAction = useMemo(() => actions.some((action) => action.oneClick === true), [actions]);\n\n return (\n <div className={styles.wrapper}>\n {!hasOneClickAction && renderDataLinks(dataLinks, styles)}\n {!hasOneClickLink && renderActions(actions, styles)}\n {!hasOneClickLink && !hasOneClickAction && annotate != null && (\n <div className={styles.addAnnotations}>\n <Button icon=\"comment-alt\" variant=\"secondary\" size=\"sm\" id={ADD_ANNOTATION_ID} onClick={annotate}>\n <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-add-annotation\">Add annotation</Trans>\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n padding: theme.spacing(0),\n }),\n dataLinks: css({\n borderTop: `1px solid ${theme.colors.border.medium}`,\n padding: theme.spacing(1),\n }),\n addAnnotations: css({\n borderTop: `1px solid ${theme.colors.border.medium}`,\n padding: theme.spacing(1),\n }),\n dataLinkButton: css({\n cursor: 'pointer',\n '&:hover': {\n textDecoration: 'underline',\n background: 'none',\n },\n padding: 0,\n height: 'auto',\n '& span': {\n whiteSpace: 'normal',\n textAlign: 'left',\n },\n }),\n oneClickWrapper: css({\n display: 'flex',\n alignItems: 'center',\n }),\n infoIcon: css({\n color: theme.colors.primary.main,\n paddingRight: theme.spacing(0.5),\n }),\n});\n"],"names":[],"mappings":";;;;;;;;;;;AAoBO,MAAM,iBAAoB,GAAA;AASjC,SAAS,wBAAA,CACP,mBACA,EAAA,UAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,oBAAA,GAAuB,CAAC,KAAA,EAAY,MAAyC,KAAA;AACjF,IAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,MAAA;AAAA;AAGF,IAAA,MAAM,eAAe,KAAM,CAAA,IAAA,CAAK,CAAC,IAAS,KAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAEhE,IAAA,IAAI,gBAAgB,IAAM,EAAA;AACxB,MAAA,2BACG,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,SAAA,EACrB,8BAAC,KAAM,EAAA,EAAA,SAAA,EAAU,QAAS,EAAA,cAAA,EAAe,cAAa,GAAK,EAAA,GAAA,EACzD,+BAAC,MAAK,EAAA,EAAA,SAAA,EAAW,OAAO,eACtB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,IAAK,EAAA,aAAA,EAAc,MAAK,IAAK,EAAA,SAAA,EAAW,OAAO,QAAU,EAAA,CAAA;AAAA,QAC9D,mBAAA,CAAoB,aAAa,KAAK;AAAA,OAAA,EACzC,GACF,CACF,EAAA,CAAA;AAAA;AAIJ,IACE,uBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,SAAA,EACrB,8BAAC,KAAM,EAAA,EAAA,SAAA,EAAU,QAAS,EAAA,cAAA,EAAe,YAAa,EAAA,GAAA,EAAK,SACxD,QAAM,EAAA,KAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,CAAM,KAAA,UAAA,CAAW,MAAM,CAAG,EAAA,MAAM,CAAC,CAAA,EACrD,CACF,EAAA,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,oBAAA;AACT;AAEA,MAAM,eAAkB,GAAA,wBAAA;AAAA,EACtB,CAAC,KAAA,qBACE,IAAA,CAAA,KAAA,EAAA,EAAM,SAAQ,iDAAkD,EAAA,QAAA,EAAA;AAAA,IAAA,gBAAA;AAAA,IAAe,EAAE,WAAW,KAAM;AAAA,GAAE,EAAA,CAAA;AAAA,EAEvG,CAAC,IAAM,EAAA,CAAA,EAAG,MACR,qBAAA,GAAA,CAAC,kBAAe,IAAM,EAAA,IAAA,EAAc,WAAa,EAAA,EAAE,WAAW,MAAO,CAAA,cAAA,EAAgB,IAAM,EAAA,MAAA,MAA1D,CAAoE,CAAA;AAAA,EAEvG;AACF,CAAA;AAEA,MAAM,aAAgB,GAAA,wBAAA;AAAA,EACpB,CAAC,KAAA,qBAAW,IAAA,CAAA,KAAA,EAAA,EAAM,SAAQ,+CAAgD,EAAA,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IAAU,EAAE,aAAa,KAAM;AAAA,GAAE,EAAA,CAAA;AAAA,EAC3G,CAAC,MAAM,CAAM,qBAAA,GAAA,CAAC,gBAAqB,MAAQ,EAAA,IAAA,EAAM,OAAQ,EAAA,WAAA,EAAA,EAAzB,CAAqC;AACvE,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,EAAE,SAAA,EAAW,UAAU,EAAC,EAAG,UAAsC,KAAA;AAChG,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,eAAkB,GAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,IAAK,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,QAAa,KAAA,IAAI,CAAG,EAAA,CAAC,SAAS,CAAC,CAAA;AACnG,EAAA,MAAM,iBAAoB,GAAA,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAK,CAAA,CAAC,MAAW,KAAA,MAAA,CAAO,QAAa,KAAA,IAAI,CAAG,EAAA,CAAC,OAAO,CAAC,CAAA;AAErG,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,OACpB,EAAA,QAAA,EAAA;AAAA,IAAC,CAAA,iBAAA,IAAqB,eAAgB,CAAA,SAAA,EAAW,MAAM,CAAA;AAAA,IACvD,CAAC,eAAA,IAAmB,aAAc,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA,IACjD,CAAC,eAAA,IAAmB,CAAC,iBAAA,IAAqB,QAAY,IAAA,IAAA,oBACpD,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,cACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,IAAA,EAAK,aAAc,EAAA,OAAA,EAAQ,WAAY,EAAA,IAAA,EAAK,IAAK,EAAA,EAAA,EAAI,iBAAmB,EAAA,OAAA,EAAS,QACvF,EAAA,QAAA,kBAAA,GAAA,CAAC,KAAM,EAAA,EAAA,OAAA,EAAQ,8CAA+C,EAAA,QAAA,EAAA,gBAAA,EAAc,GAC9E,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,SAAS,GAAI,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,QAAA;AAAA,IACf,IAAM,EAAA,CAAA;AAAA,IACN,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GACzB,CAAA;AAAA,EACD,WAAW,GAAI,CAAA;AAAA,IACb,SAAW,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAClD,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GACzB,CAAA;AAAA,EACD,gBAAgB,GAAI,CAAA;AAAA,IAClB,SAAW,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAClD,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GACzB,CAAA;AAAA,EACD,gBAAgB,GAAI,CAAA;AAAA,IAClB,MAAQ,EAAA,SAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,cAAgB,EAAA,WAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd;AAAA,IACA,OAAS,EAAA,CAAA;AAAA,IACT,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA;AAAA,MACR,UAAY,EAAA,QAAA;AAAA,MACZ,SAAW,EAAA;AAAA;AACb,GACD,CAAA;AAAA,EACD,iBAAiB,GAAI,CAAA;AAAA,IACnB,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACb,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA;AAAA,IAC5B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG;AAAA,GAChC;AACH,CAAA,CAAA;;;;"}