From b3e739d2d97172868241ed6328ae97aec69860a8 Mon Sep 17 00:00:00 2001 From: MuRong Date: Thu, 13 Aug 2026 18:07:38 +0800 Subject: [PATCH] feat(ai): add bulk model selection --- packages/app/src/App.test.tsx | 10 ++++++++ .../components/AiProviderModelsSection.tsx | 23 ++++++++++++++++++- packages/shared/src/i18n/locales/de.ts | 2 ++ packages/shared/src/i18n/locales/en.ts | 2 ++ packages/shared/src/i18n/locales/es.ts | 2 ++ packages/shared/src/i18n/locales/fr.ts | 2 ++ packages/shared/src/i18n/locales/it.ts | 2 ++ packages/shared/src/i18n/locales/ja.ts | 2 ++ packages/shared/src/i18n/locales/ko.ts | 2 ++ packages/shared/src/i18n/locales/pt-BR.ts | 2 ++ packages/shared/src/i18n/locales/ru.ts | 2 ++ packages/shared/src/i18n/locales/types.ts | 2 ++ packages/shared/src/i18n/locales/zh-CN.ts | 2 ++ packages/shared/src/i18n/locales/zh-TW.ts | 2 ++ 14 files changed, 56 insertions(+), 1 deletion(-) 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} +