{"version":3,"file":"QueryPatternsModal.cjs","sources":["../../../src/querybuilder/QueryPatternsModal.tsx"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPatternsModal.tsx\nimport { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport { useMemo, useState } from 'react';\n\nimport { type CoreApp, type DataQuery, getNextRefId, type GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, Collapse, Modal, Stack, useStyles2 } from '@grafana/ui';\n\nimport { type PromQuery } from '../types';\n\nimport { QueryPattern } from './QueryPattern';\nimport { buildVisualQueryFromString } from './parsing';\nimport { promQueryModeller } from './shared/modeller_instance';\nimport { type PromQueryPattern, PromQueryPatternType } from './types';\n\ntype Props = {\n  isOpen: boolean;\n  query: PromQuery;\n  queries: DataQuery[] | undefined;\n  app?: CoreApp;\n  onClose: () => void;\n  onChange: (query: PromQuery) => void;\n  onAddQuery?: (query: PromQuery) => void;\n};\n\nexport const QueryPatternsModal = (props: Props) => {\n  const { isOpen, onClose, onChange, onAddQuery, query, queries, app } = props;\n  const [openTabs, setOpenTabs] = useState<string[]>([]);\n  const [selectedPatternName, setSelectedPatternName] = useState<string | null>(null);\n\n  const styles = useStyles2(getStyles);\n  const hasNewQueryOption = !!onAddQuery;\n  const hasPreviousQuery = useMemo(() => {\n    const visualQuery = buildVisualQueryFromString(query.expr ?? '');\n    // has anything entered in the query, metric, labels, operations, or binary queries\n    const hasOperations = visualQuery.query.operations.length > 0,\n      hasMetric = visualQuery.query.metric,\n      hasLabels = visualQuery.query.labels.length > 0,\n      hasBinaryQueries = visualQuery.query.binaryQueries ? visualQuery.query.binaryQueries.length > 0 : false;\n\n    return hasOperations || hasMetric || hasLabels || hasBinaryQueries;\n  }, [query.expr]);\n\n  const onPatternSelect = (pattern: PromQueryPattern, selectAsNewQuery = false) => {\n    const visualQuery = buildVisualQueryFromString(selectAsNewQuery ? '' : query.expr);\n    reportInteraction('grafana_prom_kickstart_your_query_selected', {\n      app: app ?? '',\n      editorMode: query.editorMode,\n      selectedPattern: pattern.name,\n      preSelectedOperationsCount: visualQuery.query.operations.length,\n      preSelectedLabelsCount: visualQuery.query.labels.length,\n      createNewQuery: hasNewQueryOption && selectAsNewQuery,\n    });\n\n    // Apply the pattern operations before rendering the expression\n    visualQuery.query.operations = pattern.operations;\n    visualQuery.query.binaryQueries = pattern.binaryQueries;\n    const renderedExpr = promQueryModeller.renderQuery(visualQuery.query);\n\n    if (hasNewQueryOption && selectAsNewQuery) {\n      onAddQuery({\n        ...query,\n        refId: getNextRefId(queries ?? [query]),\n        expr: renderedExpr,\n      });\n    } else {\n      onChange({\n        ...query,\n        expr: renderedExpr,\n      });\n    }\n    setSelectedPatternName(null);\n    onClose();\n  };\n\n  return (\n    <Modal\n      aria-label={t(\n        'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-kick-start-your-query-modal',\n        'Kick start your query modal'\n      )}\n      isOpen={isOpen}\n      title={t(\n        'grafana-prometheus.querybuilder.query-patterns-modal.title-kick-start-your-query',\n        'Kick start your query'\n      )}\n      onDismiss={onClose}\n    >\n      <div className={styles.spacing}>\n        <Trans i18nKey=\"grafana-prometheus.querybuilder.query-patterns-modal.description-kick-start-your-query\">\n          Kick start your query by selecting one of these queries. You can then continue to complete your query.\n        </Trans>\n      </div>\n      {Object.values(PromQueryPatternType).map((patternType) => {\n        const isOpen = openTabs.includes(patternType);\n        return (\n          <Collapse\n            aria-label={t(\n              'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-toggle-query-starter',\n              'open and close {{patternType}} query starter card',\n              { patternType }\n            )}\n            key={patternType}\n            label={t(\n              'grafana-prometheus.querybuilder.query-patterns-modal.label-toggle-query-starter',\n              '{{patternType}} query starters',\n              {\n                patternType: capitalize(patternType),\n              }\n            )}\n            isOpen={isOpen}\n            onToggle={() => {\n              const action = isOpen ? 'close' : 'open';\n              reportInteraction(`grafana_prom_kickstart_toggle_pattern_card`, {\n                action,\n                patternType,\n              });\n\n              setOpenTabs((tabs) =>\n                // close tab if it's already open, otherwise open it\n                tabs.includes(patternType) ? tabs.filter((t) => t !== patternType) : [...tabs, patternType]\n              );\n            }}\n          >\n            <Stack wrap justifyContent=\"space-between\">\n              {promQueryModeller\n                .getQueryPatterns()\n                .filter((pattern) => pattern.type === patternType)\n                .map((pattern) => (\n                  <QueryPattern\n                    key={pattern.name}\n                    pattern={pattern}\n                    hasNewQueryOption={hasNewQueryOption}\n                    hasPreviousQuery={hasPreviousQuery}\n                    onPatternSelect={onPatternSelect}\n                    selectedPatternName={selectedPatternName}\n                    setSelectedPatternName={setSelectedPatternName}\n                  />\n                ))}\n            </Stack>\n          </Collapse>\n        );\n      })}\n      <Button\n        aria-label={t(\n          'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-close-kick-start-your-query-modal',\n          'close kick start your query modal'\n        )}\n        variant=\"secondary\"\n        onClick={onClose}\n      >\n        <Trans i18nKey=\"grafana-prometheus.querybuilder.query-patterns-modal.close\">Close</Trans>\n      </Button>\n    </Modal>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    spacing: css({\n      marginBottom: theme.spacing(1),\n    }),\n  };\n};\n"],"names":["useState","useStyles2","useMemo","buildVisualQueryFromString","reportInteraction","promQueryModeller","getNextRefId","jsxs","Modal","t","jsx","Trans","PromQueryPatternType","isOpen","Collapse","capitalize","Stack","QueryPattern","Button","css"],"mappings":"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"}