Address PR #12128 review feedback

- Make Select all / Clear real DropdownMenuItems so Radix roving focus reaches them by keyboard.
- Rename the zero-agent empty state to a neutral "No agents selected" now that zero agents is a valid filter.
- Use 모두 해제 for the Korean Clear label instead of 지우기 (erase).

Co-authored-by: Orca <help@stably.ai>
This commit is contained in:
Jinjing
2026-08-02 12:02:35 -07:00
co-authored by Orca
parent 0f370b382d
commit dd5783bed1
8 changed files with 30 additions and 25 deletions
+3 -3
View File
@@ -5043,9 +5043,9 @@
"ko": "모두 선택"
},
"auto.components.right.sidebar.AiVaultPanelControls.clearAgents": {
"ko": "지우기"
"ko": "모두 해제"
},
"auto.components.right.sidebar.AiVaultPanel.selectAtLeastOneAgent": {
"ko": "에이전트를 하나 이상 선택하세요"
"auto.components.right.sidebar.AiVaultPanel.noAgentsSelected": {
"ko": "선택된 에이전트가 없습니다"
}
}
@@ -39,6 +39,9 @@ import type { AiVaultHostScopeOption } from './ai-vault-host-scope'
const VAULT_HEADER_CONTROL_CLASS = 'size-6 shrink-0'
const AGENT_BULK_ACTION_CLASS =
'rounded-full px-2 py-0.5 text-[11px] font-normal text-muted-foreground focus:text-foreground'
// Why: match ToggleGroup's spacing+outline qualifiers so selected edges out-specify its border-l-0 collapse.
const VAULT_SCOPE_SELECTED_EDGE_CLASS =
'data-[spacing=0]:data-[variant=outline]:aria-[checked=true]:border-l data-[spacing=0]:data-[variant=outline]:data-[state=on]:border-l'
@@ -294,30 +297,32 @@ export function VaultViewMenu({
<span className="text-[11px] font-semibold text-muted-foreground">
{translate('auto.components.right.sidebar.AiVaultPanelControls.agents', 'Agents')}
</span>
{/* Why: real menu items so arrow keys reach them; plain buttons are skipped by Radix roving focus. */}
<div className="flex items-center gap-1">
<button
type="button"
// Why: prevent focus move so Radix does not dismiss the menu mid multi-select.
onPointerDown={(event) => event.preventDefault()}
onClick={() => onAllAgentsEnabledChange(true)}
className="rounded-full px-2 py-0.5 text-[11px] text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-40 disabled:hover:bg-transparent"
<DropdownMenuItem
disabled={allAgentsSelected}
// Why: preventDefault keeps the menu open for further multi-select.
onSelect={(event) => {
event.preventDefault()
onAllAgentsEnabledChange(true)
}}
className={AGENT_BULK_ACTION_CLASS}
>
{translate(
'auto.components.right.sidebar.AiVaultPanelControls.selectAllAgents',
'Select all'
)}
</button>
<button
type="button"
// Why: prevent focus move so Radix does not dismiss the menu mid multi-select.
onPointerDown={(event) => event.preventDefault()}
onClick={() => onAllAgentsEnabledChange(false)}
className="rounded-full px-2 py-0.5 text-[11px] text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-40 disabled:hover:bg-transparent"
</DropdownMenuItem>
<DropdownMenuItem
disabled={noAgentsSelected}
onSelect={(event) => {
event.preventDefault()
onAllAgentsEnabledChange(false)
}}
className={AGENT_BULK_ACTION_CLASS}
>
{translate('auto.components.right.sidebar.AiVaultPanelControls.clearAgents', 'Clear')}
</button>
</DropdownMenuItem>
</div>
</div>
{AI_VAULT_AGENTS.map((agent) => (
@@ -186,8 +186,8 @@ export function AiVaultSessionVirtualList({
title={
noAgentsSelected
? translate(
'auto.components.right.sidebar.AiVaultPanel.selectAtLeastOneAgent',
'Select at least one agent'
'auto.components.right.sidebar.AiVaultPanel.noAgentsSelected',
'No agents selected'
)
: translate(
'auto.components.right.sidebar.AiVaultPanel.noSessionsMatchFilters',
+1 -1
View File
@@ -11202,7 +11202,7 @@
"transcriptsSkipped": "{{count}} transcript skipped",
"noAgentSessionsFound": "No agent sessions found",
"noSessionsMatchFilters": "No sessions match the current filters",
"selectAtLeastOneAgent": "Select at least one agent",
"noAgentsSelected": "No agents selected",
"sessionId": "Session ID",
"logPath": "Log path",
"originalPaneUnavailable": "Original pane is no longer available.",
+1 -1
View File
@@ -11091,7 +11091,7 @@
"transcriptsSkipped": "{{count}} transcripciones omitidas",
"noAgentSessionsFound": "No se encontraron sesiones de agentes",
"noSessionsMatchFilters": "Ninguna sesión coincide con los filtros actuales",
"selectAtLeastOneAgent": "Selecciona al menos un agente",
"noAgentsSelected": "Ningún agente seleccionado",
"sessionId": "ID de sesión",
"logPath": "Ruta del log",
"agents": "Agentes",
+1 -1
View File
@@ -11091,7 +11091,7 @@
"transcriptsSkipped": "{{count}} transcript skipped",
"noAgentSessionsFound": "No agent sessions found",
"noSessionsMatchFilters": "No sessions match the current filters",
"selectAtLeastOneAgent": "エージェントを1つ以上選択してください",
"noAgentsSelected": "エージェントが選択されていません",
"sessionId": "セッション ID",
"logPath": "ログパス",
"agents": "エージェント",
+2 -2
View File
@@ -11091,7 +11091,7 @@
"transcriptsSkipped": "대화 기록 {{count}}개 건너뜀",
"noAgentSessionsFound": "agent 세션을 찾을 수 없습니다",
"noSessionsMatchFilters": "현재 필터와 일치하는 세션이 없습니다",
"selectAtLeastOneAgent": "에이전트를 하나 이상 선택하세요",
"noAgentsSelected": "선택된 에이전트가 없습니다",
"sessionId": "세션 ID",
"logPath": "로그 경로",
"agents": "에이전트",
@@ -11118,7 +11118,7 @@
"viewOptions": "보기 옵션",
"agents": "에이전트",
"selectAllAgents": "모두 선택",
"clearAgents": "지우기",
"clearAgents": "모두 해제",
"sort": "정렬",
"lastUpdated": "마지막 업데이트",
"created": "생성됨",
+1 -1
View File
@@ -11091,7 +11091,7 @@
"transcriptsSkipped": "跳过了 {{count}} 个记录",
"noAgentSessionsFound": "未找到智能体会话",
"noSessionsMatchFilters": "没有会话符合当前筛选条件",
"selectAtLeastOneAgent": "请至少选择一个智能体",
"noAgentsSelected": "未选择任何智能体",
"sessionId": "会话 ID",
"logPath": "日志路径",
"agents": "智能体",