Skip to content

Commit cafecad

Browse files
feat: multi Select for "Event Type" in Insights (calcom#23173)
* Multi select event type in insights * Fixing multi select query generation * Added null check for eventType filters * Updated test to support multiselect * Type fix --------- Co-authored-by: Devanshu Sharma <devanshusharma658@gmail.com>
1 parent 0ea673e commit cafecad

3 files changed

Lines changed: 25 additions & 11 deletions

File tree

packages/features/insights/hooks/useInsightsBookings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const useInsightsBookings = () => {
3535
size: 200,
3636
meta: {
3737
filter: {
38-
type: ColumnFilterType.SINGLE_SELECT,
38+
type: ColumnFilterType.MULTI_SELECT,
3939
},
4040
},
4141
enableColumnFilter: true,

packages/lib/server/service/InsightsBookingBaseService.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,16 @@ export class InsightsBookingBaseService {
298298
return null;
299299
}
300300

301-
if (id === "eventTypeId" && isSingleSelectFilterValue(value) && typeof value.data === "number") {
302-
return Prisma.sql`("eventTypeId" = ${value.data}) OR ("eventParentId" = ${value.data})`;
301+
if (id === "eventTypeId" && isMultiSelectFilterValue(value)) {
302+
const eventTypeIds = value.data.map((id) => Number(id));
303+
304+
if (eventTypeIds.length === 0) {
305+
return null;
306+
}
307+
308+
return Prisma.sql`("eventTypeId" IN (${Prisma.join(eventTypeIds)}) OR "eventParentId" IN (${Prisma.join(
309+
eventTypeIds
310+
)}))`;
303311
}
304312

305313
if (id === "userId" && isSingleSelectFilterValue(value) && typeof value.data === "number") {

packages/lib/server/service/__tests__/InsightsBookingService.integration-test.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,8 @@ describe("InsightsBookingService Integration Tests", () => {
381381
{
382382
id: "eventTypeId",
383383
value: {
384-
type: ColumnFilterType.SINGLE_SELECT,
385-
data: testData.eventType.id,
384+
type: ColumnFilterType.MULTI_SELECT,
385+
data: [testData.eventType.id],
386386
},
387387
},
388388
],
@@ -391,7 +391,9 @@ describe("InsightsBookingService Integration Tests", () => {
391391

392392
const conditions = await service.getFilterConditions();
393393
expect(conditions).toEqual(
394-
Prisma.sql`("eventTypeId" = ${testData.eventType.id}) OR ("eventParentId" = ${testData.eventType.id})`
394+
Prisma.sql`("eventTypeId" IN (${Prisma.join([
395+
testData.eventType.id,
396+
])}) OR "eventParentId" IN (${Prisma.join([testData.eventType.id])}))`
395397
);
396398

397399
await testData.cleanup();
@@ -441,8 +443,8 @@ describe("InsightsBookingService Integration Tests", () => {
441443
{
442444
id: "eventTypeId",
443445
value: {
444-
type: ColumnFilterType.SINGLE_SELECT,
445-
data: testData.eventType.id,
446+
type: ColumnFilterType.MULTI_SELECT,
447+
data: [testData.eventType.id],
446448
},
447449
},
448450
{
@@ -458,7 +460,11 @@ describe("InsightsBookingService Integration Tests", () => {
458460

459461
const conditions = await service.getFilterConditions();
460462
expect(conditions).toEqual(
461-
Prisma.sql`(("eventTypeId" = ${testData.eventType.id}) OR ("eventParentId" = ${testData.eventType.id})) AND ("userId" = ${testData.user.id})`
463+
Prisma.sql`(("eventTypeId" IN (${Prisma.join([
464+
testData.eventType.id,
465+
])}) OR "eventParentId" IN (${Prisma.join([testData.eventType.id])}))) AND ("userId" = ${
466+
testData.user.id
467+
})`
462468
);
463469

464470
await testData.cleanup();
@@ -542,8 +548,8 @@ describe("InsightsBookingService Integration Tests", () => {
542548
{
543549
id: "eventTypeId",
544550
value: {
545-
type: ColumnFilterType.SINGLE_SELECT,
546-
data: userEventType.id,
551+
type: ColumnFilterType.MULTI_SELECT,
552+
data: [userEventType.id],
547553
},
548554
},
549555
],

0 commit comments

Comments
 (0)