From c68f214eff35a26dc3391a1542ffbbec84a9c4d9 Mon Sep 17 00:00:00 2001 From: Johannes <72809645+jobenjada@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:04:10 -0700 Subject: [PATCH 1/3] fix: keep sidebar switcher icons round with long labels (#7756) Co-authored-by: Cursor Agent Co-authored-by: Johannes --- .../environments/[environmentId]/components/MainNavigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx b/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx index 707eb20f9c79..fc46ebfd6068 100644 --- a/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx @@ -475,7 +475,7 @@ export const MainNavigation = ({ ); const switcherIconClasses = - "flex h-9 w-9 items-center justify-center rounded-full bg-slate-100 text-slate-600"; + "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-slate-100 text-slate-600"; const isInitialProjectsLoading = isWorkspaceDropdownOpen && !hasInitializedProjects && !workspaceLoadError; return ( From b6a3a1537961c1baf9199c1e94b2ff36772b66aa Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:36:00 +0530 Subject: [PATCH 2/3] fix: make other option input field mandatory when sole selection (#7751) Co-authored-by: Claude Opus 4.6 --- packages/survey-ui/src/components/elements/multi-select.tsx | 6 ++---- .../survey-ui/src/components/elements/single-select.tsx | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/survey-ui/src/components/elements/multi-select.tsx b/packages/survey-ui/src/components/elements/multi-select.tsx index 22e705f10561..1954fc482e22 100644 --- a/packages/survey-ui/src/components/elements/multi-select.tsx +++ b/packages/survey-ui/src/components/elements/multi-select.tsx @@ -141,7 +141,6 @@ function DropdownVariant({ otherOptionPlaceholder, dir, otherInputRef, - required, searchPlaceholder, searchNoResultsText, }: Readonly): React.JSX.Element { @@ -279,7 +278,7 @@ function DropdownVariant({ onChange={handleOtherInputChange} placeholder={otherOptionPlaceholder} disabled={disabled} - aria-required={required} + required aria-invalid={Boolean(errorMessage)} dir={dir} className="mt-2 w-full" @@ -330,7 +329,6 @@ function ListVariant({ otherOptionPlaceholder, dir, otherInputRef, - required, }: Readonly): React.JSX.Element { const isNoneSelected = value.includes("none"); @@ -401,7 +399,7 @@ function ListVariant({ onChange={handleOtherInputChange} placeholder={otherOptionPlaceholder} disabled={disabled} - aria-required={required} + required aria-invalid={Boolean(errorMessage)} dir={dir} className="mt-2 w-full" diff --git a/packages/survey-ui/src/components/elements/single-select.tsx b/packages/survey-ui/src/components/elements/single-select.tsx index f53ff4c7136d..6b834164be57 100644 --- a/packages/survey-ui/src/components/elements/single-select.tsx +++ b/packages/survey-ui/src/components/elements/single-select.tsx @@ -272,6 +272,7 @@ function SingleSelect({ onChange={handleOtherInputChange} placeholder={otherOptionPlaceholder} disabled={disabled} + required aria-invalid={Boolean(errorMessage)} dir={dir} className="mt-2 w-full" @@ -334,7 +335,7 @@ function SingleSelect({ onChange={handleOtherInputChange} placeholder={otherOptionPlaceholder} disabled={disabled} - aria-required={required} + required aria-invalid={Boolean(errorMessage)} dir={dir} className="mt-2 w-full" From 60bd5cbeff7db13d62ece9a0a0da75b44b34fbb7 Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:08:32 +0530 Subject: [PATCH 3/3] fix: prevent environment ID leak in API error responses (#7753) Co-authored-by: Claude Opus 4.6 --- .../app/api/v1/client/[environmentId]/responses/route.ts | 9 +-------- .../app/api/v1/client/[environmentId]/storage/route.ts | 6 +----- apps/web/app/api/v1/management/responses/route.ts | 9 +-------- .../client/[environmentId]/responses/lib/utils.test.ts | 7 ++----- .../api/v2/client/[environmentId]/responses/lib/utils.ts | 9 +-------- 5 files changed, 6 insertions(+), 34 deletions(-) diff --git a/apps/web/app/api/v1/client/[environmentId]/responses/route.ts b/apps/web/app/api/v1/client/[environmentId]/responses/route.ts index d88e4f8740be..a273481095a5 100644 --- a/apps/web/app/api/v1/client/[environmentId]/responses/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/responses/route.ts @@ -123,14 +123,7 @@ export const POST = withV1ApiWrapper({ } if (survey.environmentId !== environmentId) { return { - response: responses.badRequestResponse( - "Survey is part of another environment", - { - "survey.environmentId": survey.environmentId, - environmentId, - }, - true - ), + response: responses.badRequestResponse("Survey does not belong to this environment", undefined, true), }; } diff --git a/apps/web/app/api/v1/client/[environmentId]/storage/route.ts b/apps/web/app/api/v1/client/[environmentId]/storage/route.ts index e34b14ff844c..725be10e62a2 100644 --- a/apps/web/app/api/v1/client/[environmentId]/storage/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/storage/route.ts @@ -75,11 +75,7 @@ export const POST = withV1ApiWrapper({ if (survey.environmentId !== environmentId) { return { - response: responses.badRequestResponse( - "Survey does not belong to the environment", - { surveyId, environmentId }, - true - ), + response: responses.badRequestResponse("Survey does not belong to this environment", undefined, true), }; } diff --git a/apps/web/app/api/v1/management/responses/route.ts b/apps/web/app/api/v1/management/responses/route.ts index 400d2bafa1c5..d7e36d72f51c 100644 --- a/apps/web/app/api/v1/management/responses/route.ts +++ b/apps/web/app/api/v1/management/responses/route.ts @@ -96,14 +96,7 @@ const validateSurvey = async (responseInput: TResponseInput, environmentId: stri } if (survey.environmentId !== environmentId) { return { - error: responses.badRequestResponse( - "Survey is part of another environment", - { - "survey.environmentId": survey.environmentId, - environmentId, - }, - true - ), + error: responses.badRequestResponse("Survey does not belong to this environment", undefined, true), }; } return { survey }; diff --git a/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.test.ts b/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.test.ts index 7ff1c5da0360..c5fa37250cd8 100644 --- a/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.test.ts +++ b/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.test.ts @@ -124,11 +124,8 @@ describe("checkSurveyValidity", () => { expect(result).toBeInstanceOf(Response); expect(result?.status).toBe(400); expect(responses.badRequestResponse).toHaveBeenCalledWith( - "Survey is part of another environment", - { - "survey.environmentId": "env-2", - environmentId: "env-1", - }, + "Survey does not belong to this environment", + undefined, true ); }); diff --git a/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.ts b/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.ts index c3a9056b0bed..a5b5abc0aaef 100644 --- a/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.ts +++ b/apps/web/app/api/v2/client/[environmentId]/responses/lib/utils.ts @@ -17,14 +17,7 @@ export const checkSurveyValidity = async ( responseInput: TResponseInputV2 ): Promise => { if (survey.environmentId !== environmentId) { - return responses.badRequestResponse( - "Survey is part of another environment", - { - "survey.environmentId": survey.environmentId, - environmentId, - }, - true - ); + return responses.badRequestResponse("Survey does not belong to this environment", undefined, true); } if (survey.type === "link" && survey.singleUse?.enabled) {