diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts index 587b31e743..526a5ce4f8 100644 --- a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts @@ -299,6 +299,12 @@ describe('analyzeCompletion test', () => { pos: 33, // cursor is between the bracket after the comma expectedContext: [{ kind: ContextKind.LabelName, metricName: 'metric_name' }], }, + { + title: 'no label suggestions after closing matcher', + expr: 'up{job="prometheus"}', + pos: 20, // cursor is right after the closing curly bracket + expectedContext: [], + }, { title: 'continue autocomplete labelName that defined a metric', expr: '{myL}', diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.ts index b2d439d2fe..76efc34442 100644 --- a/web/ui/module/codemirror-promql/src/complete/hybrid.ts +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.ts @@ -400,12 +400,18 @@ export function analyzeCompletion(state: EditorState, node: SyntaxNode, pos: num // so we have or to autocomplete any kind of labelName or to autocomplete only the labelName associated to the metric result.push({ kind: ContextKind.LabelName, metricName: getMetricNameInGroupBy(node, state) }); break; - case LabelMatchers: + case LabelMatchers: { + if (pos >= node.to) { + // Cursor is outside of the label matcher block (e.g. right after `}`), + // so don't offer label-related completions anymore. + break; + } // In that case we are in the given situation: // metric_name{} or {} // so we have or to autocomplete any kind of labelName or to autocomplete only the labelName associated to the metric result.push({ kind: ContextKind.LabelName, metricName: getMetricNameInVectorSelector(node, state) }); break; + } case LabelName: if (node.parent?.type.id === GroupingLabels) { // In this case we are in the given situation: