Skip to content
Snippets Groups Projects
Unverified Commit ef67b397 authored by Gustavo Saiani's avatar Gustavo Saiani Committed by GitHub
Browse files

Parse comma-separated list of numbers as URL filter params (#27436)

parent a89ade03
No related branches found
No related tags found
No related merge requests found
......@@ -29,12 +29,34 @@ export function parseParameterValue(value, parameter) {
const type = getParameterType(parameter);
if (type === "number") {
return parseFloat(value);
return parseParameterValueForNumber(value);
}
return value;
}
function parseParameterValueForNumber(value) {
// something like "1,2,3", "1, 2, 3", ",,,1,2, 3"
const valueSplitByCommas = value
.split(",")
.filter(item => item.trim() !== "");
if (valueSplitByCommas.length === 0) {
return;
}
const isCommaSeparatedListOfNumbers =
valueSplitByCommas.length > 1 &&
valueSplitByCommas.every(item => !isNaN(parseFloat(item)));
if (isCommaSeparatedListOfNumbers) {
// "1, 2, 3" will be tranformed into "1,2,3" for later use
return valueSplitByCommas.map(item => parseFloat(item)).join(",");
}
return parseFloat(value);
}
function parseParameterValueForFields(value, fields) {
if (Array.isArray(value)) {
return value.map(v => parseParameterValueForFields(v, fields));
......
......@@ -169,23 +169,6 @@ describe("parameters/utils/parameter-values", () => {
).toBe("");
});
it("should parse the parameter value as a float when it is a number parameter without fields", () => {
const numberParameter = {
id: 111,
slug: "numberParameter",
type: "number/=",
};
expect(
getParameterValueFromQueryParams(
numberParameter,
{
[numberParameter.slug]: "123.456",
},
metadata,
),
).toEqual([123.456]);
});
it("should not parse numeric values that are dates as floats", () => {
field1.isNumeric = () => true;
field1.isDate = () => true;
......@@ -363,6 +346,55 @@ describe("parameters/utils/parameter-values", () => {
"parameter2 default value",
);
});
describe("for number filter type", () => {
const numberParameter = {
id: 111,
slug: "numberParameter",
type: "number/=",
};
const runGetParameterValueFromQueryParams = value =>
getParameterValueFromQueryParams(
numberParameter,
{
[numberParameter.slug]: value,
},
metadata,
);
it("should parse the parameter value as a float when it is a number parameter without fields", () => {
expect(runGetParameterValueFromQueryParams("123.456")).toEqual([
123.456,
]);
});
describe("when parsing parameter value that is a comma-separated list of numbers", () => {
it("should return list when every item is a number", () => {
expect(runGetParameterValueFromQueryParams("1,,2,3,4")).toEqual([
"1,2,3,4",
]);
expect(runGetParameterValueFromQueryParams("1, ,2,3,4")).toEqual([
"1,2,3,4",
]);
expect(runGetParameterValueFromQueryParams(",1,2,3,")).toEqual([
"1,2,3",
]);
});
it("should return undefined when list is not formatted properly", () => {
expect(runGetParameterValueFromQueryParams(",,,")).toEqual([
undefined,
]);
expect(runGetParameterValueFromQueryParams(" ")).toEqual([undefined]);
});
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]);
});
});
});
});
describe("getParameterValuesByIdFromQueryParams", () => {
......
......@@ -39,7 +39,7 @@ const dashboardDetails = {
parameters: [filterDetails],
};
describe.skip("issue 25374", () => {
describe("issue 25374", () => {
beforeEach(() => {
cy.intercept("POST", `/api/card/*/query`).as("cardQuery");
......
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