mirror of
https://github.com/grafana/grafana.git
synced 2026-08-09 12:48:18 -05:00
* pushed to get help of a genius * fix: error response is not json * feat: make request on click * refactor: remove print statement * refactor: remove unnecessary code * feat: convert grafana variables to value for API request * use the parser to interpolate and recover the original query (#64591) * Prettify query: use the parser to interpolate and recover the original query * Fix typo Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * Fix typo Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * fix: reverse transformation not working --------- Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Co-authored-by: Gareth Dawson <gwdawson.work@gmail.com> * fix: bugs created from merge * refactor: move prettify code out of monaco editor * fix: variables with the same value get converted back to the incorect variable * refactor * use consistent styling with bigquery * fix: only allow text/plain and application/json * fix: only make the request if the query is valid * endpoint now returns application/json * prettify from js * WIP: not all cases are handles, code still needs cleaning up * WIP * large refactor, finished support for all pipeline expressions * add tests for all format functions * idk why these files changed * add support for range aggregation expr & refactor * add support for vector aggregation expressions * add support for bin op expression * add support for literal and vector expressions * add tests and fix some bugs * add support for distinct and decolorize * feat: update variable replace and return * fix: lezer throws an errow when using a range variable * remove api implementation * remove api implementation * remove type assertions * add feature flag * update naming * fix: bug incorrectly formatting unwrap with labelfilter * support label replace expr * remove duplicate code (after migration) * add more tests * validate query before formatting * move tests to lezer repo * add feature tracking * populate feature tracking with some data * upgrade lezer version to 0.1.7 * bump lezer to 0.1.8 * add tests --------- Co-authored-by: Matias Chomicki <matyax@gmail.com> Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>
108 lines
3.1 KiB
TypeScript
108 lines
3.1 KiB
TypeScript
import { css } from '@emotion/css';
|
|
import React from 'react';
|
|
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { config } from '@grafana/runtime';
|
|
import { useStyles2, HorizontalGroup, IconButton, Tooltip, Icon } from '@grafana/ui';
|
|
import { getModKey } from 'app/core/utils/browser';
|
|
|
|
import { testIds } from '../../components/LokiQueryEditor';
|
|
import { LokiQueryField } from '../../components/LokiQueryField';
|
|
import { getStats } from '../../components/stats';
|
|
import { LokiQueryEditorProps } from '../../components/types';
|
|
import { formatLogqlQuery } from '../../queryUtils';
|
|
import { QueryStats } from '../../types';
|
|
|
|
import { LokiQueryBuilderExplained } from './LokiQueryBuilderExplained';
|
|
|
|
type Props = LokiQueryEditorProps & {
|
|
showExplain: boolean;
|
|
setQueryStats: React.Dispatch<React.SetStateAction<QueryStats | null>>;
|
|
};
|
|
|
|
export function LokiQueryCodeEditor({
|
|
query,
|
|
datasource,
|
|
range,
|
|
onRunQuery,
|
|
onChange,
|
|
data,
|
|
app,
|
|
showExplain,
|
|
history,
|
|
setQueryStats,
|
|
}: Props) {
|
|
const styles = useStyles2(getStyles);
|
|
|
|
const lokiFormatQuery = config.featureToggles.lokiFormatQuery;
|
|
const onClickFormatQueryButton = async () => onChange({ ...query, expr: formatLogqlQuery(query.expr, datasource) });
|
|
|
|
return (
|
|
<div className={styles.wrapper}>
|
|
<LokiQueryField
|
|
datasource={datasource}
|
|
query={query}
|
|
range={range}
|
|
onRunQuery={onRunQuery}
|
|
onChange={onChange}
|
|
history={history}
|
|
data={data}
|
|
app={app}
|
|
data-testid={testIds.editor}
|
|
onQueryType={async (query: string) => {
|
|
const stats = await getStats(datasource, query);
|
|
setQueryStats(stats);
|
|
}}
|
|
ExtraFieldElement={
|
|
<>
|
|
{lokiFormatQuery && (
|
|
<div className={styles.buttonGroup}>
|
|
<div>
|
|
<HorizontalGroup spacing="sm">
|
|
<IconButton
|
|
onClick={onClickFormatQueryButton}
|
|
name="brackets-curly"
|
|
size="xs"
|
|
tooltip="Format query"
|
|
/>
|
|
<Tooltip content={`Use ${getModKey()}+z to undo`}>
|
|
<Icon className={styles.hint} name="keyboard" />
|
|
</Tooltip>
|
|
</HorizontalGroup>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</>
|
|
}
|
|
/>
|
|
{showExplain && <LokiQueryBuilderExplained query={query.expr} />}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => {
|
|
return {
|
|
wrapper: css`
|
|
max-width: 100%;
|
|
.gf-form {
|
|
margin-bottom: 0.5;
|
|
}
|
|
`,
|
|
buttonGroup: css`
|
|
border: 1px solid ${theme.colors.border.medium};
|
|
border-top: none;
|
|
padding: ${theme.spacing(0.5, 0.5, 0.5, 0.5)};
|
|
margin-bottom: ${theme.spacing(0.5)};
|
|
display: flex;
|
|
flex-grow: 1;
|
|
justify-content: end;
|
|
font-size: ${theme.typography.bodySmall.fontSize};
|
|
`,
|
|
hint: css`
|
|
color: ${theme.colors.text.disabled};
|
|
white-space: nowrap;
|
|
cursor: help;
|
|
`,
|
|
};
|
|
};
|