Skip to content

Commit 2440fb9

Browse files
committed
feat: move codebase indexing enable/disable to General Settings
- Create new GeneralSettings component with codebase indexing toggle - Add General Settings as first tab in SettingsView - Add translation keys for General Settings section - Update IndexingStatusBadge to conditionally render based on setting - Remove enable/disable checkbox from CodeIndexPopover - Fixes #5680
1 parent a163053 commit 2440fb9

File tree

5 files changed

+125
-16
lines changed

5 files changed

+125
-16
lines changed

webview-ui/src/components/chat/CodeIndexPopover.tsx

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
VSCodeDropdown,
88
VSCodeOption,
99
VSCodeLink,
10-
VSCodeCheckbox,
1110
} from "@vscode/webview-ui-toolkit/react"
1211
import * as ProgressPrimitive from "@radix-ui/react-progress"
1312
import { vscode } from "@src/utils/vscode"
@@ -513,20 +512,6 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
513512
</div>
514513

515514
<div className="p-4">
516-
{/* Enable/Disable Toggle */}
517-
<div className="mb-4">
518-
<div className="flex items-center gap-2">
519-
<VSCodeCheckbox
520-
checked={currentSettings.codebaseIndexEnabled}
521-
onChange={(e: any) => updateSetting("codebaseIndexEnabled", e.target.checked)}>
522-
<span className="font-medium">{t("settings:codeIndex.enableLabel")}</span>
523-
</VSCodeCheckbox>
524-
<StandardTooltip content={t("settings:codeIndex.enableDescription")}>
525-
<span className="codicon codicon-info text-xs text-vscode-descriptionForeground cursor-help" />
526-
</StandardTooltip>
527-
</div>
528-
</div>
529-
530515
{/* Status Section */}
531516
<div className="space-y-2">
532517
<h4 className="text-sm font-medium">{t("settings:codeIndex.statusTitle")}</h4>

webview-ui/src/components/chat/IndexingStatusBadge.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { vscode } from "@src/utils/vscode"
55
import { useAppTranslation } from "@/i18n/TranslationContext"
66
import { useTooltip } from "@/hooks/useTooltip"
77
import { CodeIndexPopover } from "./CodeIndexPopover"
8+
import { useExtensionState } from "@/context/ExtensionStateContext"
89
import type { IndexingStatus, IndexingStatusUpdateMessage } from "@roo/ExtensionMessage"
910

1011
interface IndexingStatusBadgeProps {
@@ -15,6 +16,7 @@ export const IndexingStatusBadge: React.FC<IndexingStatusBadgeProps> = ({ classN
1516
const { t } = useAppTranslation()
1617
const { showTooltip, handleMouseEnter, handleMouseLeave, cleanup } = useTooltip({ delay: 300 })
1718
const [isHovered, setIsHovered] = useState(false)
19+
const extensionState = useExtensionState()
1820

1921
const [indexingStatus, setIndexingStatus] = useState<IndexingStatus>({
2022
systemStatus: "Standby",
@@ -52,6 +54,12 @@ export const IndexingStatusBadge: React.FC<IndexingStatusBadgeProps> = ({ classN
5254
[indexingStatus.processedItems, indexingStatus.totalItems],
5355
)
5456

57+
// Don't render the badge if codebase indexing is disabled
58+
const codebaseIndexEnabled = extensionState.codebaseIndexConfig?.codebaseIndexEnabled ?? true
59+
if (!codebaseIndexEnabled) {
60+
return null
61+
}
62+
5563
// Get tooltip text with internationalization
5664
const getTooltipText = () => {
5765
switch (indexingStatus.systemStatus) {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import React, { type HTMLAttributes } from "react"
2+
import { Settings } from "lucide-react"
3+
import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
4+
import { useAppTranslation } from "@src/i18n/TranslationContext"
5+
import { SectionHeader } from "./SectionHeader"
6+
import { Section } from "./Section"
7+
import { StandardTooltip } from "@src/components/ui"
8+
import { cn } from "@src/lib/utils"
9+
10+
type GeneralSettingsProps = HTMLAttributes<HTMLDivElement> & {
11+
codebaseIndexEnabled: boolean
12+
setCodebaseIndexEnabled: (enabled: boolean) => void
13+
}
14+
15+
export const GeneralSettings = ({
16+
codebaseIndexEnabled,
17+
setCodebaseIndexEnabled,
18+
className,
19+
...props
20+
}: GeneralSettingsProps) => {
21+
const { t } = useAppTranslation()
22+
23+
return (
24+
<div className={cn("flex flex-col gap-2", className)} {...props}>
25+
<SectionHeader description={t("settings:general.description")}>
26+
<div className="flex items-center gap-2">
27+
<Settings className="w-4" />
28+
<div>{t("settings:sections.general")}</div>
29+
</div>
30+
</SectionHeader>
31+
32+
<Section>
33+
{/* Codebase Indexing Enable/Disable */}
34+
<div className="flex flex-col gap-3">
35+
<div className="flex items-center gap-2 font-bold">
36+
<span className="codicon codicon-database" />
37+
<div>{t("settings:general.codebaseIndexing.label")}</div>
38+
</div>
39+
40+
<div className="flex items-center gap-2">
41+
<VSCodeCheckbox
42+
checked={codebaseIndexEnabled}
43+
onChange={(e: any) => setCodebaseIndexEnabled(e.target.checked)}
44+
data-testid="codebase-indexing-enabled-checkbox">
45+
<span className="font-medium">{t("settings:general.codebaseIndexing.enableLabel")}</span>
46+
</VSCodeCheckbox>
47+
<StandardTooltip content={t("settings:general.codebaseIndexing.enableDescription")}>
48+
<span className="codicon codicon-info text-xs text-vscode-descriptionForeground cursor-help" />
49+
</StandardTooltip>
50+
</div>
51+
52+
<div className="text-vscode-descriptionForeground text-sm">
53+
{t("settings:general.codebaseIndexing.description")}
54+
</div>
55+
</div>
56+
</Section>
57+
</div>
58+
)
59+
}

webview-ui/src/components/settings/SettingsView.tsx

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
Globe,
2323
Info,
2424
MessageSquare,
25+
Settings,
2526
LucideIcon,
2627
} from "lucide-react"
2728

@@ -65,6 +66,7 @@ import { LanguageSettings } from "./LanguageSettings"
6566
import { About } from "./About"
6667
import { Section } from "./Section"
6768
import PromptsSettings from "./PromptsSettings"
69+
import { GeneralSettings } from "./GeneralSettings"
6870
import { cn } from "@/lib/utils"
6971

7072
export const settingsTabsContainer = "flex flex-1 overflow-hidden [&.narrow_.tab-label]:hidden"
@@ -79,6 +81,7 @@ export interface SettingsViewRef {
7981
}
8082

8183
const sectionNames = [
84+
"general",
8285
"providers",
8386
"autoApprove",
8487
"browser",
@@ -111,7 +114,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
111114
const [activeTab, setActiveTab] = useState<SectionName>(
112115
targetSection && sectionNames.includes(targetSection as SectionName)
113116
? (targetSection as SectionName)
114-
: "providers",
117+
: "general",
115118
)
116119

117120
const prevApiConfigName = useRef(currentApiConfigName)
@@ -176,6 +179,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
176179
alwaysAllowFollowupQuestions,
177180
alwaysAllowUpdateTodoList,
178181
followupAutoApproveTimeoutMs,
182+
codebaseIndexConfig,
179183
} = cachedState
180184

181185
const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration])
@@ -258,6 +262,24 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
258262
})
259263
}, [])
260264

265+
const setCodebaseIndexEnabled = useCallback((enabled: boolean) => {
266+
setCachedState((prevState) => {
267+
const currentConfig = prevState.codebaseIndexConfig || {}
268+
if (currentConfig.codebaseIndexEnabled === enabled) {
269+
return prevState
270+
}
271+
272+
setChangeDetected(true)
273+
return {
274+
...prevState,
275+
codebaseIndexConfig: {
276+
...currentConfig,
277+
codebaseIndexEnabled: enabled,
278+
},
279+
}
280+
})
281+
}, [])
282+
261283
const isSettingValid = !errorMessage
262284

263285
const handleSubmit = () => {
@@ -323,6 +345,22 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
323345
vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration })
324346
vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting })
325347
vscode.postMessage({ type: "profileThresholds", values: profileThresholds })
348+
349+
// Save codebase index settings with proper defaults
350+
const codeIndexSettingsToSave = {
351+
codebaseIndexEnabled: codebaseIndexConfig?.codebaseIndexEnabled ?? true,
352+
codebaseIndexQdrantUrl: codebaseIndexConfig?.codebaseIndexQdrantUrl ?? "http://localhost:6333",
353+
codebaseIndexEmbedderProvider: codebaseIndexConfig?.codebaseIndexEmbedderProvider ?? "openai",
354+
codebaseIndexEmbedderBaseUrl: codebaseIndexConfig?.codebaseIndexEmbedderBaseUrl,
355+
codebaseIndexEmbedderModelId: codebaseIndexConfig?.codebaseIndexEmbedderModelId ?? "",
356+
codebaseIndexEmbedderModelDimension: codebaseIndexConfig?.codebaseIndexEmbedderModelDimension,
357+
codebaseIndexSearchMaxResults: codebaseIndexConfig?.codebaseIndexSearchMaxResults,
358+
codebaseIndexSearchMinScore: codebaseIndexConfig?.codebaseIndexSearchMinScore,
359+
codebaseIndexOpenAiCompatibleBaseUrl: codebaseIndexConfig?.codebaseIndexOpenAiCompatibleBaseUrl,
360+
codebaseIndexOpenAiCompatibleModelDimension:
361+
codebaseIndexConfig?.codebaseIndexOpenAiCompatibleModelDimension,
362+
}
363+
vscode.postMessage({ type: "saveCodeIndexSettingsAtomic", codeIndexSettings: codeIndexSettingsToSave })
326364
setChangeDetected(false)
327365
}
328366
}
@@ -392,6 +430,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
392430

393431
const sections: { id: SectionName; icon: LucideIcon }[] = useMemo(
394432
() => [
433+
{ id: "general", icon: Settings },
395434
{ id: "providers", icon: Webhook },
396435
{ id: "autoApprove", icon: CheckCheck },
397436
{ id: "browser", icon: SquareMousePointer },
@@ -539,6 +578,14 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
539578

540579
{/* Content area */}
541580
<TabContent className="p-0 flex-1 overflow-auto">
581+
{/* General Section */}
582+
{activeTab === "general" && (
583+
<GeneralSettings
584+
codebaseIndexEnabled={codebaseIndexConfig?.codebaseIndexEnabled ?? true}
585+
setCodebaseIndexEnabled={setCodebaseIndexEnabled}
586+
/>
587+
)}
588+
542589
{/* Providers Section */}
543590
{activeTab === "providers" && (
544591
<div>

webview-ui/src/i18n/locales/en/settings.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"discardButton": "Discard changes"
2222
},
2323
"sections": {
24+
"general": "General",
2425
"providers": "Providers",
2526
"autoApprove": "Auto-Approve",
2627
"browser": "Browser",
@@ -33,6 +34,15 @@
3334
"language": "Language",
3435
"about": "About Roo Code"
3536
},
37+
"general": {
38+
"description": "Configure general application settings and preferences.",
39+
"codebaseIndexing": {
40+
"label": "Codebase Indexing",
41+
"enableLabel": "Enable Codebase Indexing",
42+
"enableDescription": "Enable code indexing for improved search and context understanding",
43+
"description": "When enabled, Roo can index your codebase to provide better search and context understanding capabilities."
44+
}
45+
},
3646
"prompts": {
3747
"description": "Configure support prompts that are used for quick actions like enhancing prompts, explaining code, and fixing issues. These prompts help Roo provide better assistance for common development tasks."
3848
},

0 commit comments

Comments
 (0)