From 954bc8065d5b23da6312d2c0ccd22a9ed2ca2351 Mon Sep 17 00:00:00 2001 From: Eric Hare Date: Fri, 10 Apr 2026 08:22:44 -0700 Subject: [PATCH] fix: Make sure we don't toggle models on hover (#12599) * fix: Make sure we don't toggle models on hover * Revert to switch with stop prop event * global stopPropogation property for switches --- src/frontend/src/components/ui/switch.tsx | 52 +++++++++++++------ .../__tests__/ModelSelection.test.tsx | 23 ++++++++ .../components/ModelSelection.tsx | 2 + 3 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/frontend/src/components/ui/switch.tsx b/src/frontend/src/components/ui/switch.tsx index 0ff4443af7..63d0b751a0 100644 --- a/src/frontend/src/components/ui/switch.tsx +++ b/src/frontend/src/components/ui/switch.tsx @@ -4,25 +4,47 @@ import * as SwitchPrimitives from "@radix-ui/react-switch"; import * as React from "react"; import { cn } from "@/utils/utils"; +interface SwitchProps + extends React.ComponentPropsWithoutRef { + stopPropagation?: boolean; +} + const Switch = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - ( + ( + { className, stopPropagation = false, onClick, onPointerDown, ...props }, + ref, + ) => ( + - -)); + onClick={(event) => { + onClick?.(event); + if (stopPropagation) { + event.stopPropagation(); + } + }} + onPointerDown={(event) => { + onPointerDown?.(event); + if (stopPropagation) { + event.stopPropagation(); + } + }} + {...props} + ref={ref} + > + + + ), +); Switch.displayName = SwitchPrimitives.Root.displayName; export { Switch }; diff --git a/src/frontend/src/modals/modelProviderModal/__tests__/ModelSelection.test.tsx b/src/frontend/src/modals/modelProviderModal/__tests__/ModelSelection.test.tsx index a67aba1d3e..9a06f94c41 100644 --- a/src/frontend/src/modals/modelProviderModal/__tests__/ModelSelection.test.tsx +++ b/src/frontend/src/modals/modelProviderModal/__tests__/ModelSelection.test.tsx @@ -147,6 +147,29 @@ describe("ModelSelection", () => { expect(onModelToggle).toHaveBeenCalledWith("gpt-4", expect.any(Boolean)); }); + + it("should not bubble toggle clicks to parent containers", async () => { + const onModelToggle = jest.fn(); + const onParentClick = jest.fn(); + const user = userEvent.setup(); + + render( +
+ +
, + ); + + const toggle = screen.getByTestId( + "embeddings-toggle-text-embedding-ada-002", + ); + await user.click(toggle); + + expect(onModelToggle).toHaveBeenCalledWith( + "text-embedding-ada-002", + expect.any(Boolean), + ); + expect(onParentClick).not.toHaveBeenCalled(); + }); }); describe("Empty States", () => { diff --git a/src/frontend/src/modals/modelProviderModal/components/ModelSelection.tsx b/src/frontend/src/modals/modelProviderModal/components/ModelSelection.tsx index feee96f17e..8bdfaa8942 100644 --- a/src/frontend/src/modals/modelProviderModal/components/ModelSelection.tsx +++ b/src/frontend/src/modals/modelProviderModal/components/ModelSelection.tsx @@ -46,6 +46,8 @@ const ModelRow = ({ checked={enabled} onCheckedChange={(checked) => onToggle(model.model_name, checked)} data-testid={`${testIdPrefix}-toggle-${model.model_name}`} + aria-label={`${enabled ? "Disable" : "Enable"} ${model.model_name}`} + stopPropagation /> )}