From a8dabd6ae3303de8d472323422b7194769b5929f Mon Sep 17 00:00:00 2001 From: Ariya Hidayat <ariya@metabase.com> Date: Thu, 17 Feb 2022 10:51:42 -0800 Subject: [PATCH] Custom expression editor: do not always suggest an open parenthesis (#20533) For functions which do not accept any arguments, i.e. COUNT and CUMULATIVECOUNT, do not suggest the completion with the "(" character. --- frontend/src/metabase/lib/expressions/suggest.js | 10 ++++++++-- .../expressions/ExpressionEditorTextfield.jsx | 2 +- .../test/metabase/lib/expressions/suggest.unit.spec.js | 10 +++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/frontend/src/metabase/lib/expressions/suggest.js b/frontend/src/metabase/lib/expressions/suggest.js index 8c90b18b027..a61f1bac92e 100644 --- a/frontend/src/metabase/lib/expressions/suggest.js +++ b/frontend/src/metabase/lib/expressions/suggest.js @@ -19,6 +19,12 @@ import { EDITOR_FK_SYMBOLS, } from "./config"; +const suggestionText = func => { + const { displayName, args } = func; + const suffix = args.length > 0 ? "(" : " "; + return displayName + suffix; +}; + export function suggest({ source, query, @@ -59,7 +65,7 @@ export function suggest({ .map(func => ({ type: "functions", name: func.displayName, - text: func.displayName + "(", + text: suggestionText(func), index: targetOffset, icon: "function", order: 1, @@ -73,7 +79,7 @@ export function suggest({ .map(func => ({ type: "aggregations", name: func.displayName, - text: func.displayName + "(", + text: suggestionText(func), index: targetOffset, icon: "function", order: 1, diff --git a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx index b05fbf3f5de..df8a2570355 100644 --- a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx +++ b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx @@ -138,7 +138,7 @@ export default class ExpressionEditorTextfield extends React.Component { const extraTrim = openParen && alreadyOpenParen ? 1 : 0; const replacement = suggested.slice(0, suggested.length - extraTrim); - const updatedExpression = prefix + replacement.trim() + postfix; + const updatedExpression = prefix + replacement + postfix; this.handleExpressionChange(updatedExpression); const caretPos = updatedExpression.length - postfix.length; diff --git a/frontend/test/metabase/lib/expressions/suggest.unit.spec.js b/frontend/test/metabase/lib/expressions/suggest.unit.spec.js index e1e1e11ed0b..5489aefd1e6 100644 --- a/frontend/test/metabase/lib/expressions/suggest.unit.spec.js +++ b/frontend/test/metabase/lib/expressions/suggest.unit.spec.js @@ -207,9 +207,9 @@ describe("metabase/lib/expression/suggest", () => { it("should suggest partial matches after an aggregation", () => { expect(suggest({ source: "average(c", ...aggregationOpts })).toEqual([ // FIXME: the next four should not appear - { type: "aggregations", text: "Count(" }, + { type: "aggregations", text: "Count " }, { type: "aggregations", text: "CountIf(" }, - { type: "aggregations", text: "CumulativeCount(" }, + { type: "aggregations", text: "CumulativeCount " }, { type: "aggregations", text: "CumulativeSum(" }, { type: "fields", text: "[C] " }, { type: "fields", text: "[count] " }, @@ -223,9 +223,9 @@ describe("metabase/lib/expression/suggest", () => { it("should suggest partial matches in aggregation", () => { expect(suggest({ source: "1 + C", ...aggregationOpts })).toEqual([ - { type: "aggregations", text: "Count(" }, + { type: "aggregations", text: "Count " }, { type: "aggregations", text: "CountIf(" }, - { type: "aggregations", text: "CumulativeCount(" }, + { type: "aggregations", text: "CumulativeCount " }, { type: "aggregations", text: "CumulativeSum(" }, { type: "fields", text: "[C] " }, { type: "fields", text: "[count] " }, @@ -258,7 +258,7 @@ describe("metabase/lib/expression/suggest", () => { startRule: "aggregation", }), ).toEqual([ - { type: "aggregations", text: "Count(" }, + { type: "aggregations", text: "Count " }, { type: "aggregations", text: "CountIf(" }, ]); }); -- GitLab