Skip to content
Snippets Groups Projects
Unverified Commit 437684cd authored by Alexander Polyankin's avatar Alexander Polyankin Committed by GitHub
Browse files

Fix numeric parameter parsing (#44792)


* Fix numeric parameter parsing

* Update frontend/src/metabase-lib/v1/parameters/utils/parameter-parsing.unit.spec.js

Co-authored-by: default avatarNemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>

* Update frontend/src/metabase-lib/v1/parameters/utils/parameter-parsing.unit.spec.js

Co-authored-by: default avatarNemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>

---------

Co-authored-by: default avatarUladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
Co-authored-by: default avatarNemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
parent a11d4dd7
No related branches found
No related tags found
No related merge requests found
......@@ -60,26 +60,27 @@ export function parseParameterValue(value: any, parameter: Parameter) {
function parseParameterValueForNumber(value: string | string[]) {
if (Array.isArray(value)) {
return value.map(number => parseFloat(number));
const numbers = value.map(number => parseFloat(number));
return numbers.every(number => !isNaN(number)) ? numbers : null;
}
// something like "1,2,3", "1, 2, 3", ",,,1,2, 3"
const splitValues = value.split(",").filter(item => item.trim() !== "");
if (splitValues.length === 0) {
return;
return null;
}
const isNumberList =
splitValues.length > 1 &&
splitValues.every(item => !isNaN(parseFloat(item)));
if (splitValues.length > 1) {
const numbers = splitValues.map(number => parseFloat(number));
if (numbers.every(number => !isNaN(number))) {
return numbers.join(",");
}
if (isNumberList) {
// "1, 2, 3" will be tranformed into "1,2,3" for later use
return splitValues.map(item => parseFloat(item)).join(",");
return null;
}
return parseFloat(value);
const number = parseFloat(value);
return isNaN(number) ? null : number;
}
function parseParameterValueForFields(
......@@ -108,6 +109,7 @@ function normalizeParameterValueForWidget(
) {
const fieldType = getParameterType(parameter);
if (
value != null &&
fieldType !== "date" &&
fieldType !== "temporal-unit" &&
!Array.isArray(value)
......
......@@ -294,6 +294,29 @@ describe("parameters/utils/parameter-values", () => {
);
});
it.each([
{ value: "", expectedValue: null },
{ value: "abc", expectedValue: null },
{ value: "123", expectedValue: [123] },
{ value: "123abc", expectedValue: [123] },
{ value: ["123"], expectedValue: [123] },
{ value: ["123", "234"], expectedValue: [123, 234] },
{ value: ["123", "abc"], expectedValue: null },
{ value: ["123", "234abc"], expectedValue: [123, 234] },
{ value: "123,234", expectedValue: ["123,234"] },
{ value: "123,abc", expectedValue: null },
{ value: "123,234abc", expectedValue: ["123,234"] },
])(
"should parse number parameter value $value",
({ value, expectedValue }) => {
const parameter = createMockParameter({ type: "number/=" });
const queryParams = { [parameter.slug]: value };
expect(
getParameterValueFromQueryParams(parameter, queryParams),
).toEqual(expectedValue);
},
);
describe("last used param value", () => {
it("should use query parameter over last used param value", () => {
expect(
......@@ -349,16 +372,14 @@ describe("parameters/utils/parameter-values", () => {
]);
});
it("should return undefined when list is not formatted properly", () => {
expect(runGetParameterValueFromQueryParams(",,,")).toEqual([
undefined,
]);
expect(runGetParameterValueFromQueryParams(" ")).toEqual([undefined]);
it("should return `null` when list is not formatted properly", () => {
expect(runGetParameterValueFromQueryParams(",,,")).toEqual(null);
expect(runGetParameterValueFromQueryParams(" ")).toEqual(null);
});
it("should return first parseable float if value includes non-numeric characters", () => {
expect(runGetParameterValueFromQueryParams("1,a,3,")).toEqual([1]);
expect(runGetParameterValueFromQueryParams("1a,b,3,")).toEqual([1]);
it("should return `null` if value includes non-numeric characters", () => {
expect(runGetParameterValueFromQueryParams("1,a,3,")).toEqual(null);
expect(runGetParameterValueFromQueryParams("1a,b,3,")).toEqual(null);
});
});
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment