Skip to content

Commit a664a9b

Browse files
VojtechVidraOPesickaflows-bot[bot]
authored
feat(react,react-components): survey support, Survey Popover component (#605)
* feat(react,js,react-components,js-components): survey * feat: survey-component * feat: question types * feat: survey block type * feat: design * feat: more design * feat: end screen question * feat: even more design * feat: rename open option to other option * feat: rating options, refactor * feat: design tweaks, switch to session storage * feat: disabled continue button * feat: end screen auto submit * fix: other option spacebar * feat: min max rating scale * fix: submit other option * feat: survey submit url * fix: click and conditions * feat: drop empty question answer * feat: survey trigger * @flows/react@1.21.1-canary.0 * @flows/react-components@2.7.1-canary.0 * feat: survey blockStateId * feat: page targeting and tour trigger tests * feat: jsdoc * feat: jsdoc improvements * feat: survey prop jsdoc * feat: feedback improvements * fix: css * fix: remove running surveys --------- Co-authored-by: Ondřej Pešička <77627332+OPesicka@users.noreply.github.com> Co-authored-by: flows-bot[bot] <170794745+flows-bot[bot]@users.noreply.github.com>
1 parent 68ffa3c commit a664a9b

62 files changed

Lines changed: 3457 additions & 421 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

pnpm-lock.yaml

Lines changed: 84 additions & 81 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

workspaces/e2e/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"react-router": "^7.12.0"
1818
},
1919
"devDependencies": {
20-
"@playwright/test": "^1.58.2",
20+
"@playwright/test": "^1.59.0",
2121
"@types/node": "^24",
2222
"@types/react": "^19.2.7",
2323
"@types/react-dom": "^19.2.3",

workspaces/e2e/pages/react.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { HashRouter, Link, Route, Routes } from "react-router";
2121

2222
import * as components from "@flows/react-components";
2323
import * as tourComponents from "@flows/react-components/tour";
24+
import * as surveyComponents from "@flows/react-components/survey";
2425
import "@flows/react-components/index.css";
2526
import type { LanguageOption } from "@flows/shared";
2627

@@ -150,6 +151,7 @@ createRoot(document.getElementById("root")!).render(
150151
apiUrl={apiUrl}
151152
components={{ ...components, Card, BlockTrigger, StateMemory, Action }}
152153
tourComponents={{ ...tourComponents, Card, Action }}
154+
surveyComponents={{ ...surveyComponents }}
153155
LinkComponent={enableLinkComponent ? LinkComponent : undefined}
154156
>
155157
<Routes>

workspaces/e2e/tests/page-targeting.spec.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,37 @@ const slotTourBlock: TourStep = {
6363
slotId: "my-slot",
6464
};
6565

66+
const getSurvey = ({
67+
page_targeting_operator,
68+
page_targeting_values,
69+
}: {
70+
page_targeting_operator?: string;
71+
page_targeting_values?: string[];
72+
}): Block => ({
73+
id: randomUUID(),
74+
workflowId: randomUUID(),
75+
type: "survey",
76+
componentType: "BasicsV2SurveyPopover",
77+
data: {},
78+
exitNodes: ["complete", "cancel"],
79+
slottable: false,
80+
survey: {
81+
id: randomUUID(),
82+
blockStateId: randomUUID(),
83+
questions: [
84+
{
85+
id: "question-1",
86+
type: "freeform",
87+
title: "Hello",
88+
description: "Question",
89+
optional: true,
90+
},
91+
],
92+
},
93+
page_targeting_operator,
94+
page_targeting_values,
95+
});
96+
6697
const run = (packageName: string) => {
6798
test(`${packageName} - should work with query params`, async ({ page }) => {
6899
const block: Block = {
@@ -399,6 +430,51 @@ const run = (packageName: string) => {
399430
await page.goto(`/${packageName}.html`);
400431
await expect(page.getByText("Workflow block", { exact: true })).toBeHidden();
401432
});
433+
434+
test.describe("survey", () => {
435+
test.skip(packageName !== "react", "Survey page-targeting coverage is only available in React");
436+
437+
test(`${packageName} - should show survey without page targeting`, async ({ page }) => {
438+
await mockBlocksEndpoint(page, [getSurvey({})]);
439+
await page.goto(`/${packageName}.html`);
440+
await expect(page.getByText("Hello", { exact: true })).toBeVisible();
441+
});
442+
443+
test(`${packageName} - should not show survey with incorrect page targeting`, async ({
444+
page,
445+
}) => {
446+
await mockBlocksEndpoint(
447+
page,
448+
[getSurvey({ page_targeting_operator: "contains", page_targeting_values: ["/wrong"] })],
449+
);
450+
await page.goto(`/${packageName}.html`);
451+
await expect(page.getByText("Hello", { exact: true })).toBeHidden();
452+
});
453+
454+
test(`${packageName} - should show survey with correct page targeting`, async ({ page }) => {
455+
await mockBlocksEndpoint(page, [
456+
getSurvey({
457+
page_targeting_operator: "contains",
458+
page_targeting_values: [`/${packageName}.html`],
459+
}),
460+
]);
461+
await page.goto(`/${packageName}.html`);
462+
await expect(page.getByText("Hello", { exact: true })).toBeVisible();
463+
});
464+
465+
test(`${packageName} - should show survey with query params`, async ({ page }) => {
466+
await mockBlocksEndpoint(page, [
467+
getSurvey({
468+
page_targeting_operator: "contains",
469+
page_targeting_values: [`/${packageName}.html?param=value`],
470+
}),
471+
]);
472+
await page.goto(`/${packageName}.html`);
473+
await expect(page.getByText("Hello", { exact: true })).toBeHidden();
474+
await page.goto(`/${packageName}.html?param=value`);
475+
await expect(page.getByText("Hello", { exact: true })).toBeVisible();
476+
});
477+
});
402478
};
403479

404480
run("js");

0 commit comments

Comments
 (0)