{"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 { selectors } from '@grafana/e2e-selectors';\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';\nimport { AdHocFilterItem } from '../Table/TableNG/types';\n\nexport interface AdHocFilterModel extends AdHocFilterItem {\n  onClick: () => void;\n}\n\nexport interface FilterByGroupedLabelsModel {\n  onFilterForGroupedLabels?: () => void;\n  onFilterOutGroupedLabels?: () => void;\n}\n\ninterface VizTooltipFooterProps {\n  dataLinks: Array<LinkModel<Field>>;\n  actions?: Array<ActionModel<Field>>;\n  adHocFilters?: AdHocFilterModel[];\n  filterByGroupedLabels?: FilterByGroupedLabelsModel;\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.footerSection}>\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.footerSection}>\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 = ({\n  dataLinks,\n  actions = [],\n  annotate,\n  adHocFilters = [],\n  filterByGroupedLabels,\n}: 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 && adHocFilters.length > 0 && (\n        <div className={styles.footerSection}>\n          {adHocFilters.map((item, index) => (\n            <Button key={index} icon=\"filter\" variant=\"secondary\" size=\"sm\" onClick={item.onClick}>\n              <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-filter-for-value\">\n                Filter for '{{ value: item.value }}'\n              </Trans>\n            </Button>\n          ))}\n        </div>\n      )}\n\n      {!hasOneClickLink && !hasOneClickAction && filterByGroupedLabels && (\n        <div className={styles.footerSection}>\n          <Stack direction=\"column\" gap={0.5} width=\"fit-content\">\n            <Button\n              icon=\"filter\"\n              variant=\"secondary\"\n              size=\"sm\"\n              onClick={filterByGroupedLabels.onFilterForGroupedLabels}\n              data-testid={selectors.components.VizTooltipFooter.buttons.apply}\n            >\n              <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-apply-series-as-filter\">Filter on this value</Trans>\n            </Button>\n            <Button\n              icon=\"filter\"\n              variant=\"secondary\"\n              size=\"sm\"\n              onClick={filterByGroupedLabels.onFilterOutGroupedLabels}\n              data-testid={selectors.components.VizTooltipFooter.buttons.applyInverse}\n            >\n              <Trans i18nKey=\"grafana-ui.viz-tooltip.footer-apply-series-as-inverse-filter\">\n                Filter out this value\n              </Trans>\n            </Button>\n          </Stack>\n        </div>\n      )}\n      {!hasOneClickLink && !hasOneClickAction && annotate != null && (\n        <div className={styles.footerSection}>\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  footerSection: 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":";;;;;;;;;;;;;AAiCO,MAAM,iBAAA,GAAoB;AASjC,SAAS,wBAAA,CACP,mBAAA,EACA,UAAA,EACA,OAAA,EACA;AACA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,EAAY,MAAA,KAAyC;AACjF,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,IAAI,CAAA;AAEhE,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EACrB,8BAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,cAAA,EAAe,cAAa,GAAA,EAAK,GAAA,EACzD,+BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,OAAO,eAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,aAAA,EAAc,MAAK,IAAA,EAAK,SAAA,EAAW,OAAO,QAAA,EAAU,CAAA;AAAA,QAC9D,mBAAA,CAAoB,aAAa,KAAK;AAAA,OAAA,EACzC,GACF,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EACrB,8BAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,cAAA,EAAe,YAAA,EAAa,GAAA,EAAK,SACxD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,UAAA,CAAW,MAAM,CAAA,EAAG,MAAM,CAAC,CAAA,EACrD,CAAA,EACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,OAAO,oBAAA;AACT;AAEA,MAAM,eAAA,GAAkB,wBAAA;AAAA,EACtB,CAAC,KAAA,qBACC,IAAA,CAAC,KAAA,EAAA,EAAM,SAAQ,iDAAA,EAAkD,QAAA,EAAA;AAAA,IAAA,gBAAA;AAAA,IAAe,EAAE,WAAW,KAAA;AAAM,GAAA,EAAE,CAAA;AAAA,EAEvG,CAAC,IAAA,EAAM,CAAA,EAAG,MAAA,qBACR,GAAA,CAAC,kBAAe,IAAA,EAAM,IAAA,EAAc,WAAA,EAAa,EAAE,WAAW,MAAA,CAAO,cAAA,EAAgB,IAAA,EAAM,MAAA,MAA1D,CAAoE,CAAA;AAAA,EAEvG;AACF,CAAA;AAEA,MAAM,aAAA,GAAgB,wBAAA;AAAA,EACpB,CAAC,KAAA,qBAAU,IAAA,CAAC,KAAA,EAAA,EAAM,SAAQ,+CAAA,EAAgD,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IAAU,EAAE,aAAa,KAAA;AAAM,GAAA,EAAE,CAAA;AAAA,EAC3G,CAAC,MAAM,CAAA,qBAAM,GAAA,CAAC,gBAAqB,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAA,EAAzB,CAAqC;AACvE,CAAA;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,SAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,QAAA;AAAA,EACA,eAAe,EAAC;AAAA,EAChB;AACF,CAAA,KAA6B;AAC3B,EAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAM,SAAA,CAAU,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,KAAa,IAAI,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACnG,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,QAAA,KAAa,IAAI,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAErG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,OAAA,EACpB,QAAA,EAAA;AAAA,IAAA,CAAC,iBAAA,IAAqB,eAAA,CAAgB,SAAA,EAAW,MAAM,CAAA;AAAA,IACvD,CAAC,eAAA,IAAmB,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AAAA,IACjD,CAAC,eAAA,IAAmB,CAAC,iBAAA,IAAqB,YAAA,CAAa,MAAA,GAAS,CAAA,oBAC/D,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EACpB,uBAAa,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACvB,GAAA,CAAC,MAAA,EAAA,EAAmB,IAAA,EAAK,QAAA,EAAS,SAAQ,WAAA,EAAY,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAC5E,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,SAAQ,gDAAA,EAAiD,QAAA,EAAA;AAAA,MAAA,cAAA;AAAA,MACjD,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAAA,MAAE;AAAA,KAAA,EACrC,CAAA,EAAA,EAHW,KAIb,CACD,CAAA,EACH,CAAA;AAAA,IAGD,CAAC,eAAA,IAAmB,CAAC,iBAAA,IAAqB,qBAAA,wBACxC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EACrB,+BAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAS,GAAA,EAAK,GAAA,EAAK,OAAM,aAAA,EACxC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAS,qBAAA,CAAsB,wBAAA;AAAA,UAC/B,aAAA,EAAa,SAAA,CAAU,UAAA,CAAW,gBAAA,CAAiB,OAAA,CAAQ,KAAA;AAAA,UAE3D,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,sDAAA,EAAuD,QAAA,EAAA,sBAAA,EAAoB;AAAA;AAAA,OAC5F;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAS,qBAAA,CAAsB,wBAAA;AAAA,UAC/B,aAAA,EAAa,SAAA,CAAU,UAAA,CAAW,gBAAA,CAAiB,OAAA,CAAQ,YAAA;AAAA,UAE3D,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,8DAAA,EAA+D,QAAA,EAAA,uBAAA,EAE9E;AAAA;AAAA;AACF,KAAA,EACF,CAAA,EACF,CAAA;AAAA,IAED,CAAC,eAAA,IAAmB,CAAC,iBAAA,IAAqB,QAAA,IAAY,IAAA,oBACrD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,aAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,IAAA,EAAK,EAAA,EAAI,iBAAA,EAAmB,OAAA,EAAS,QAAA,EACvF,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,8CAAA,EAA+C,QAAA,EAAA,gBAAA,EAAc,GAC9E,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,MAAM,SAAA,GAAY,CAAC,KAAA,MAA0B;AAAA,EAC3C,SAAS,GAAA,CAAI;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GACzB,CAAA;AAAA,EACD,eAAe,GAAA,CAAI;AAAA,IACjB,SAAA,EAAW,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAClD,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GACzB,CAAA;AAAA,EACD,gBAAgB,GAAA,CAAI;AAAA,IAClB,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW;AAAA,MACT,cAAA,EAAgB,WAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,IACA,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AAAA,EACD,iBAAiB,GAAA,CAAI;AAAA,IACnB,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AAAA,EACD,UAAU,GAAA,CAAI;AAAA,IACZ,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,IAC5B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,GAChC;AACH,CAAA,CAAA;;;;"}