Skip to content

Commit 4b0b216

Browse files
authored
Merge pull request #648 from zendesk/akuttruff/CD-3271
feat: adds support for multiple dynamic filters
2 parents 079733c + 2605a4b commit 4b0b216

File tree

2 files changed

+86
-52
lines changed

2 files changed

+86
-52
lines changed

src/modules/ticket-fields/fields/LookupField.test.tsx

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { TicketFieldObject } from "../data-types/TicketFieldObject";
33
import { buildAdvancedDynamicFilterParams } from "./LookupField";
44

55
describe("buildAdvancedDynamicFilterParams", () => {
6-
it('returns correct dynamic filter value and matching field value for operator "matches"', () => {
6+
it('returns correct dynamic filter array for operator "matches"', () => {
77
const filter: LookupRelationshipFieldFilter = {
88
all: [
99
{
@@ -40,16 +40,12 @@ describe("buildAdvancedDynamicFilterParams", () => {
4040
},
4141
];
4242

43-
const [dynamicValue, fieldValue] = buildAdvancedDynamicFilterParams(
44-
filter,
45-
fields
46-
);
43+
const result = buildAdvancedDynamicFilterParams(filter, fields);
4744

48-
expect(dynamicValue).toBe("ticket_fields_12345");
49-
expect(fieldValue).toBe("fooValue");
45+
expect(result).toEqual([{ key: "ticket_fields_12345", value: "fooValue" }]);
5046
});
5147

52-
it('returns correct dynamic filter value and matching field value for operator "not_matches" in any', () => {
48+
it('returns correct dynamic filter array for operator "not_matches" in any', () => {
5349
const filter: LookupRelationshipFieldFilter = {
5450
all: [{ field: "someField", operator: "is", value: "foo" }],
5551
any: [
@@ -85,16 +81,12 @@ describe("buildAdvancedDynamicFilterParams", () => {
8581
},
8682
];
8783

88-
const [dynamicValue, fieldValue] = buildAdvancedDynamicFilterParams(
89-
filter,
90-
fields
91-
);
84+
const result = buildAdvancedDynamicFilterParams(filter, fields);
9285

93-
expect(dynamicValue).toBe("ticket_fields_67890");
94-
expect(fieldValue).toBe("barValue");
86+
expect(result).toEqual([{ key: "ticket_fields_67890", value: "barValue" }]);
9587
});
9688

97-
it("returns [undefined, undefined] when no matching operator found", () => {
89+
it("returns an empty array when no matching operator found", () => {
9890
const filter: LookupRelationshipFieldFilter = {
9991
all: [{ field: "someField", operator: "is", value: "foo" }],
10092
any: [{ field: "anotherField", operator: "is", value: "foo" }],
@@ -124,13 +116,9 @@ describe("buildAdvancedDynamicFilterParams", () => {
124116
},
125117
];
126118

127-
const [dynamicValue, fieldValue] = buildAdvancedDynamicFilterParams(
128-
filter,
129-
fields
130-
);
119+
const result = buildAdvancedDynamicFilterParams(filter, fields);
131120

132-
expect(dynamicValue).toBeUndefined();
133-
expect(fieldValue).toBeUndefined();
121+
expect(result).toEqual([]);
134122
});
135123

136124
it("returns [undefined, undefined] when filter is undefined", () => {
@@ -148,12 +136,57 @@ describe("buildAdvancedDynamicFilterParams", () => {
148136
},
149137
];
150138

151-
const [dynamicValue, fieldValue] = buildAdvancedDynamicFilterParams(
152-
undefined,
153-
fields
154-
);
139+
const result = buildAdvancedDynamicFilterParams(undefined, fields);
155140

156-
expect(dynamicValue).toBeUndefined();
157-
expect(fieldValue).toBeUndefined();
141+
expect(result).toEqual([]);
142+
});
143+
144+
it("returns multiple filters if more than one matches", () => {
145+
const filter: LookupRelationshipFieldFilter = {
146+
all: [
147+
{
148+
field: "someField",
149+
operator: "matches",
150+
value: "ticket_fields_12345",
151+
},
152+
{
153+
field: "otherField",
154+
operator: "matches",
155+
value: "ticket_fields_67890",
156+
},
157+
],
158+
any: [],
159+
};
160+
const fields: TicketFieldObject[] = [
161+
{
162+
id: 12345,
163+
name: "Test Field 1",
164+
value: "fooValue",
165+
error: null,
166+
label: "Test Field 1",
167+
required: false,
168+
description: "",
169+
type: "text",
170+
options: [],
171+
},
172+
{
173+
id: 67890,
174+
name: "Test Field 2",
175+
value: "barValue",
176+
error: null,
177+
label: "Test Field 2",
178+
required: false,
179+
description: "",
180+
type: "text",
181+
options: [],
182+
},
183+
];
184+
185+
const result = buildAdvancedDynamicFilterParams(filter, fields);
186+
187+
expect(result).toEqual([
188+
{ key: "ticket_fields_12345", value: "fooValue" },
189+
{ key: "ticket_fields_67890", value: "barValue" },
190+
]);
158191
});
159192
});

src/modules/ticket-fields/fields/LookupField.tsx

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,27 @@ export function buildAdvancedDynamicFilterParams(
2222
filter?: LookupRelationshipFieldFilter,
2323
fields: TicketFieldObject[] = []
2424
) {
25-
const dynamicFilters = filter
26-
? [
27-
...filter.all.filter(
28-
(filter) =>
29-
filter.operator === "matches" || filter.operator === "not_matches"
30-
),
31-
...filter.any.filter(
32-
(filter) =>
33-
filter.operator === "matches" || filter.operator === "not_matches"
34-
),
35-
]
36-
: [];
25+
if (!filter) return [];
3726

38-
const parsedFilterId =
39-
dynamicFilters && dynamicFilters[0]?.value.split("ticket_fields_")[1];
40-
41-
const field = fields.find((field) => {
42-
const parsedFieldId = field.id.toString();
27+
const dynamicFilters = [
28+
...filter.all.filter(
29+
(f) => f.operator === "matches" || f.operator === "not_matches"
30+
),
31+
...filter.any.filter(
32+
(f) => f.operator === "matches" || f.operator === "not_matches"
33+
),
34+
];
4335

44-
return parsedFieldId === parsedFilterId;
36+
return dynamicFilters.map((f) => {
37+
const parsedFilterId = f.value.split("ticket_fields_")[1];
38+
const field = fields.find(
39+
(field) => field.id.toString() === parsedFilterId
40+
);
41+
return {
42+
key: f.value,
43+
value: field?.value ?? null,
44+
};
4545
});
46-
47-
return [dynamicFilters[0]?.value, field?.value];
4846
}
4947

5048
export function getCustomObjectKey(targetType: string) {
@@ -139,15 +137,18 @@ export function LookupField({
139137
searchParams.set("field_id", fieldId.toString());
140138
searchParams.set("requester_id", userId.toString());
141139

142-
const [filterValue, fieldValue] = buildAdvancedDynamicFilterParams(
140+
const filterPairs = buildAdvancedDynamicFilterParams(
143141
field.relationship_filter,
144142
visibleFields
145143
);
146144

147-
const fieldValueParam = fieldValue?.toString() || "";
148-
const filterValueParam = `filter[dynamic_values][${filterValue}]`;
149-
150-
if (filterValue) searchParams.set(filterValueParam, fieldValueParam);
145+
for (const { key: filterValue, value: fieldValue } of filterPairs) {
146+
if (filterValue) {
147+
const filterValueParam = `filter[dynamic_values][${filterValue}]`;
148+
const fieldValueParam = fieldValue?.toString() || "";
149+
searchParams.set(filterValueParam, fieldValueParam);
150+
}
151+
}
151152

152153
if (organizationId) searchParams.set("organization_id", organizationId);
153154

0 commit comments

Comments
 (0)