perf: Add "Select All" checkbox to Plugin and MCP Server selection dialogs (#1790)

* Initial plan

* Add "Select All" checkbox to Plugin and MCP Server selection dialogs

Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com>

* Make "Select All" text clickable by adding onClick handler to container

Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com>
This commit is contained in:
Copilot
2025-11-18 17:00:05 +08:00
committed by GitHub
parent 8a42daa63f
commit c3c51b0fbf
5 changed files with 58 additions and 0 deletions
@@ -146,6 +146,26 @@ export default function PipelineExtension({
); );
}; };
const handleToggleAllPlugins = () => {
if (tempSelectedPluginIds.length === allPlugins.length) {
// Deselect all
setTempSelectedPluginIds([]);
} else {
// Select all
setTempSelectedPluginIds(allPlugins.map((p) => getPluginId(p)));
}
};
const handleToggleAllMCPServers = () => {
if (tempSelectedMCPIds.length === allMCPServers.length) {
// Deselect all
setTempSelectedMCPIds([]);
} else {
// Select all
setTempSelectedMCPIds(allMCPServers.map((s) => s.uuid || ''));
}
};
const handleConfirmPluginSelection = async () => { const handleConfirmPluginSelection = async () => {
const newSelected = allPlugins.filter((p) => const newSelected = allPlugins.filter((p) =>
tempSelectedPluginIds.includes(getPluginId(p)), tempSelectedPluginIds.includes(getPluginId(p)),
@@ -330,6 +350,23 @@ export default function PipelineExtension({
<DialogHeader> <DialogHeader>
<DialogTitle>{t('pipelines.extensions.selectPlugins')}</DialogTitle> <DialogTitle>{t('pipelines.extensions.selectPlugins')}</DialogTitle>
</DialogHeader> </DialogHeader>
{allPlugins.length > 0 && (
<div
className="flex items-center gap-3 px-1 py-2 border-b cursor-pointer"
onClick={handleToggleAllPlugins}
>
<Checkbox
checked={
tempSelectedPluginIds.length === allPlugins.length &&
allPlugins.length > 0
}
onCheckedChange={handleToggleAllPlugins}
/>
<span className="text-sm font-medium">
{t('pipelines.extensions.selectAll')}
</span>
</div>
)}
<div className="flex-1 overflow-y-auto space-y-2 pr-2"> <div className="flex-1 overflow-y-auto space-y-2 pr-2">
{allPlugins.length === 0 ? ( {allPlugins.length === 0 ? (
<div className="flex h-full items-center justify-center"> <div className="flex h-full items-center justify-center">
@@ -404,6 +441,23 @@ export default function PipelineExtension({
{t('pipelines.extensions.selectMCPServers')} {t('pipelines.extensions.selectMCPServers')}
</DialogTitle> </DialogTitle>
</DialogHeader> </DialogHeader>
{allMCPServers.length > 0 && (
<div
className="flex items-center gap-3 px-1 py-2 border-b cursor-pointer"
onClick={handleToggleAllMCPServers}
>
<Checkbox
checked={
tempSelectedMCPIds.length === allMCPServers.length &&
allMCPServers.length > 0
}
onCheckedChange={handleToggleAllMCPServers}
/>
<span className="text-sm font-medium">
{t('pipelines.extensions.selectAll')}
</span>
</div>
)}
<div className="flex-1 overflow-y-auto space-y-2 pr-2"> <div className="flex-1 overflow-y-auto space-y-2 pr-2">
{allMCPServers.length === 0 ? ( {allMCPServers.length === 0 ? (
<div className="flex h-full items-center justify-center"> <div className="flex h-full items-center justify-center">
+1
View File
@@ -484,6 +484,7 @@ const enUS = {
toolCount: '{{count}} tools', toolCount: '{{count}} tools',
noPluginsInstalled: 'No installed plugins', noPluginsInstalled: 'No installed plugins',
noMCPServersConfigured: 'No configured MCP servers', noMCPServersConfigured: 'No configured MCP servers',
selectAll: 'Select All',
}, },
debugDialog: { debugDialog: {
title: 'Pipeline Chat', title: 'Pipeline Chat',
+1
View File
@@ -487,6 +487,7 @@ const jaJP = {
toolCount: '{{count}}個のツール', toolCount: '{{count}}個のツール',
noPluginsInstalled: 'インストールされているプラグインがありません', noPluginsInstalled: 'インストールされているプラグインがありません',
noMCPServersConfigured: '設定されているMCPサーバーがありません', noMCPServersConfigured: '設定されているMCPサーバーがありません',
selectAll: 'すべて選択',
}, },
debugDialog: { debugDialog: {
title: 'パイプラインのチャット', title: 'パイプラインのチャット',
+1
View File
@@ -466,6 +466,7 @@ const zhHans = {
toolCount: '{{count}} 个工具', toolCount: '{{count}} 个工具',
noPluginsInstalled: '无已安装的插件', noPluginsInstalled: '无已安装的插件',
noMCPServersConfigured: '无已配置的 MCP 服务器', noMCPServersConfigured: '无已配置的 MCP 服务器',
selectAll: '全选',
}, },
debugDialog: { debugDialog: {
title: '流水线对话', title: '流水线对话',
+1
View File
@@ -464,6 +464,7 @@ const zhHant = {
toolCount: '{{count}} 個工具', toolCount: '{{count}} 個工具',
noPluginsInstalled: '無已安裝的插件', noPluginsInstalled: '無已安裝的插件',
noMCPServersConfigured: '無已配置的 MCP 伺服器', noMCPServersConfigured: '無已配置的 MCP 伺服器',
selectAll: '全選',
}, },
debugDialog: { debugDialog: {
title: '流程線對話', title: '流程線對話',