From 2c453bd4910552234cbdd2057a90d69347bd7ecd Mon Sep 17 00:00:00 2001 From: Piyush Gupta <56182734+gupta-piyush19@users.noreply.github.com> Date: Thu, 15 Aug 2024 19:32:34 +0530 Subject: [PATCH] fix: Filters do not apply to summary impressions (#2986) Co-authored-by: Johannes Co-authored-by: Matthias Nannt --- .../summary/components/SummaryMetadata.tsx | 10 +++++----- apps/web/playwright/js.spec.ts | 2 +- .../migration.sql | 2 ++ packages/database/schema.prisma | 2 ++ packages/lib/display/service.ts | 12 +++++++++++- packages/lib/response/service.ts | 11 +++++++++-- packages/types/displays.ts | 1 + 7 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 packages/database/migrations/20240815084351_adds_relation_between_display_and_response/migration.sql diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/components/SummaryMetadata.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/components/SummaryMetadata.tsx index 77a4068176..75245077a6 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/components/SummaryMetadata.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/components/SummaryMetadata.tsx @@ -13,10 +13,10 @@ const StatCard = ({ label, percentage, value, tooltipText }) => (
-

+

{label} - {percentage && percentage !== "NaN%" && ( - {percentage} + {typeof percentage === "number" && !isNaN(percentage) && ( + {percentage}% )}

{value}

@@ -67,13 +67,13 @@ export const SummaryMetadata = ({ setShowDropOffs, showDropOffs, surveySummary } /> 100 ? null : Math.round(startsPercentage)} value={totalResponses === 0 ? - : totalResponses} tooltipText="Number of times the survey has been started." /> 100 ? null : Math.round(completedPercentage)} value={completedResponses === 0 ? - : completedResponses} tooltipText="Number of times the survey has been completed." /> diff --git a/apps/web/playwright/js.spec.ts b/apps/web/playwright/js.spec.ts index 925d2d4c2d..e1ff23b2a6 100644 --- a/apps/web/playwright/js.spec.ts +++ b/apps/web/playwright/js.spec.ts @@ -110,7 +110,7 @@ test.describe("JS Package Test", async () => { expect(impressionsCount).toEqual("Impressions\n\n1"); await expect(page.getByRole("link", { name: "Responses (1)" })).toBeVisible(); - await expect(page.getByRole("button", { name: "Completed100%" })).toBeVisible(); + await expect(page.getByRole("button", { name: "Completed 100%" })).toBeVisible(); await expect(page.getByText("1 Responses", { exact: true }).first()).toBeVisible(); await expect(page.getByText("CTR100%")).toBeVisible(); diff --git a/packages/database/migrations/20240815084351_adds_relation_between_display_and_response/migration.sql b/packages/database/migrations/20240815084351_adds_relation_between_display_and_response/migration.sql new file mode 100644 index 0000000000..5e6ee5cfe9 --- /dev/null +++ b/packages/database/migrations/20240815084351_adds_relation_between_display_and_response/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE "Display" ADD CONSTRAINT "Display_responseId_fkey" FOREIGN KEY ("responseId") REFERENCES "Response"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/database/schema.prisma b/packages/database/schema.prisma index 32d544a3cd..89085c7c7e 100644 --- a/packages/database/schema.prisma +++ b/packages/database/schema.prisma @@ -132,6 +132,7 @@ model Response { // singleUseId, used to prevent multiple responses singleUseId String? language String? + display Display? @@unique([surveyId, singleUseId]) @@index([surveyId, createdAt]) // to determine monthly response count @@ -199,6 +200,7 @@ model Display { person Person? @relation(fields: [personId], references: [id], onDelete: Cascade) personId String? responseId String? @unique + response Response? @relation(fields: [responseId], references: [id], onDelete: Cascade) status DisplayStatus? @@index([surveyId]) diff --git a/packages/lib/display/service.ts b/packages/lib/display/service.ts index 75f798d13e..e45f0d1960 100644 --- a/packages/lib/display/service.ts +++ b/packages/lib/display/service.ts @@ -84,7 +84,11 @@ export const updateDisplay = async ( }, }), ...(displayInput.responseId && { - responseId: displayInput.responseId, + response: { + connect: { + id: displayInput.responseId, + }, + }, }), }; const display = await prisma.display.update({ @@ -236,6 +240,12 @@ export const getDisplayCountBySurveyId = reactCache( lte: filters.createdAt.max, }, }), + ...(filters && + filters.responseIds && { + responseId: { + in: filters.responseIds, + }, + }), }, }); return displayCount; diff --git a/packages/lib/response/service.ts b/packages/lib/response/service.ts index 8712a6d620..6dabaadbae 100644 --- a/packages/lib/response/service.ts +++ b/packages/lib/response/service.ts @@ -457,8 +457,12 @@ export const getSurveySummary = reactCache( } const batchSize = 3000; - const responseCount = await getResponseCountBySurveyId(surveyId, filterCriteria); - const pages = Math.ceil(responseCount / batchSize); + const totalResponseCount = await getResponseCountBySurveyId(surveyId); + const filteredResponseCount = await getResponseCountBySurveyId(surveyId, filterCriteria); + + const hasFilter = totalResponseCount !== filteredResponseCount; + + const pages = Math.ceil(filteredResponseCount / batchSize); const responsesArray = await Promise.all( Array.from({ length: pages }, (_, i) => { @@ -467,8 +471,11 @@ export const getSurveySummary = reactCache( ); const responses = responsesArray.flat(); + const responseIds = hasFilter ? responses.map((response) => response.id) : []; + const displayCount = await getDisplayCountBySurveyId(surveyId, { createdAt: filterCriteria?.createdAt, + ...(hasFilter && { responseIds }), }); const dropOff = getSurveySummaryDropOff(survey, responses, displayCount); diff --git a/packages/types/displays.ts b/packages/types/displays.ts index b350f58829..9c37c80fdc 100644 --- a/packages/types/displays.ts +++ b/packages/types/displays.ts @@ -42,6 +42,7 @@ export const ZDisplayFilters = z.object({ max: z.date().optional(), }) .optional(), + responseIds: z.array(z.string().cuid()).optional(), }); export type TDisplayFilters = z.infer;