diff --git a/packages/app/src/App.test.tsx b/packages/app/src/App.test.tsx index 871f6bbe..40d5ae8b 100644 --- a/packages/app/src/App.test.tsx +++ b/packages/app/src/App.test.tsx @@ -2988,6 +2988,16 @@ describe("Markra workspace", () => { expect(screen.getAllByText("GPT Image 1").length).toBeGreaterThan(0); await waitFor(() => expect(document.querySelector(".app-toast")).toHaveTextContent("Model list updated.")); + fireEvent.click(screen.getByRole("button", { name: "Deselect all models" })); + expect(screen.getByRole("switch", { name: "GPT-5" })).toHaveAttribute("aria-checked", "false"); + expect(screen.getByRole("switch", { name: "GPT Image 1" })).toHaveAttribute("aria-checked", "false"); + expect(screen.getByRole("switch", { name: "GPT-5.5 Thinking Updated" })).toHaveAttribute("aria-checked", "false"); + + fireEvent.click(screen.getByRole("button", { name: "Select all models" })); + expect(screen.getByRole("switch", { name: "GPT-5" })).toHaveAttribute("aria-checked", "true"); + expect(screen.getByRole("switch", { name: "GPT Image 1" })).toHaveAttribute("aria-checked", "true"); + expect(screen.getByRole("switch", { name: "GPT-5.5 Thinking Updated" })).toHaveAttribute("aria-checked", "true"); + fireEvent.click(screen.getByRole("button", { name: "Save AI providers" })); await waitFor(() => diff --git a/packages/app/src/components/AiProviderModelsSection.tsx b/packages/app/src/components/AiProviderModelsSection.tsx index 30f798bb..071cc70b 100644 --- a/packages/app/src/components/AiProviderModelsSection.tsx +++ b/packages/app/src/components/AiProviderModelsSection.tsx @@ -66,6 +66,11 @@ export function AiProviderModelsSection({ setModelDraft: Dispatch>; updateSelectedProvider: (updater: (provider: AiProviderConfig) => AiProviderConfig) => unknown; }) { + const allModelsEnabled = modelOptions.length > 0 && modelOptions.every((model) => model.enabled); + const toggleAllModelsLabel = translate( + allModelsEnabled ? "settings.ai.deselectAllModels" : "settings.ai.selectAllModels" + ); + return (
@@ -95,7 +100,23 @@ export function AiProviderModelsSection({

{translate("settings.ai.availableModels")}

-
+
+ + updateSelectedProvider((provider) => { + const enabled = !provider.models.every((model) => model.enabled); + + return { + ...provider, + models: provider.models.map((model) => ({ ...model, enabled })) + }; + }) + } + > + {toggleAllModelsLabel} +