feat: hide gitignored vault content

This commit is contained in:
lucaronin
2026-04-28 08:55:40 +02:00
parent 2fe6c5b580
commit d2c15b8469
24 changed files with 1035 additions and 75 deletions

View File

@@ -17,6 +17,8 @@ const emptySettings: Settings = {
release_channel: null,
theme_mode: null,
ui_language: null,
default_ai_agent: null,
hide_gitignored_files: null,
}
function installPointerCapturePolyfill() {
@@ -102,6 +104,21 @@ describe('SettingsPanel', () => {
autogit_inactive_threshold_seconds: 30,
release_channel: null,
theme_mode: 'light',
hide_gitignored_files: true,
}))
expect(onClose).toHaveBeenCalled()
})
it('saves Gitignored content visibility immediately for keyboard close', () => {
render(
<SettingsPanel open={true} settings={emptySettings} onSave={onSave} onClose={onClose} />
)
fireEvent.click(screen.getByTestId('settings-hide-gitignored-files'))
fireEvent.keyDown(screen.getByTestId('settings-panel'), { key: 'Escape' })
expect(onSave).toHaveBeenCalledWith(expect.objectContaining({
hide_gitignored_files: false,
}))
expect(onClose).toHaveBeenCalled()
})

View File

@@ -33,6 +33,7 @@ import {
type ThemeMode,
} from '../lib/themeMode'
import { normalizeReleaseChannel, serializeReleaseChannel, type ReleaseChannel } from '../lib/releaseChannel'
import { shouldHideGitignoredFiles } from '../lib/gitignoredVisibility'
import { trackEvent } from '../lib/telemetry'
import { Button } from './ui/button'
import { Checkbox, type CheckedState } from './ui/checkbox'
@@ -70,6 +71,7 @@ interface SettingsDraft {
themeMode: ThemeMode
uiLanguage: UiLanguagePreference
initialH1AutoRename: boolean
hideGitignoredFiles: boolean
crashReporting: boolean
analytics: boolean
explicitOrganization: boolean
@@ -101,6 +103,8 @@ interface SettingsBodyProps {
systemLocale: AppLocale
initialH1AutoRename: boolean
setInitialH1AutoRename: (value: boolean) => void
hideGitignoredFiles: boolean
setHideGitignoredFiles: (value: boolean) => void
explicitOrganization: boolean
setExplicitOrganization: (value: boolean) => void
crashReporting: boolean
@@ -139,6 +143,7 @@ function createSettingsDraft(
themeMode: resolveSettingsDraftThemeMode(settings.theme_mode),
uiLanguage: settings.ui_language ?? SYSTEM_UI_LANGUAGE,
initialH1AutoRename: settings.initial_h1_auto_rename_enabled ?? true,
hideGitignoredFiles: shouldHideGitignoredFiles(settings),
crashReporting: settings.crash_reporting_enabled ?? false,
analytics: settings.analytics_enabled ?? false,
explicitOrganization: explicitOrganizationEnabled,
@@ -180,6 +185,7 @@ function buildSettingsFromDraft(settings: Settings, draft: SettingsDraft): Setti
ui_language: serializeUiLanguagePreference(draft.uiLanguage),
initial_h1_auto_rename_enabled: draft.initialH1AutoRename,
default_ai_agent: draft.defaultAiAgent,
hide_gitignored_files: draft.hideGitignoredFiles,
}
}
@@ -268,6 +274,11 @@ function SettingsPanelInner({
[],
)
const handleGitignoredVisibilityChange = useCallback((value: boolean) => {
updateDraft('hideGitignoredFiles', value)
onSave({ ...settings, hide_gitignored_files: value })
}, [onSave, settings, updateDraft])
const handleSave = useCallback(() => {
trackTelemetryConsentChange(settings.analytics_enabled === true, draft.analytics)
onSave(buildSettingsFromDraft(settings, draft))
@@ -338,6 +349,8 @@ function SettingsPanelInner({
setUiLanguage={(value) => updateDraft('uiLanguage', value)}
initialH1AutoRename={draft.initialH1AutoRename}
setInitialH1AutoRename={(value) => updateDraft('initialH1AutoRename', value)}
hideGitignoredFiles={draft.hideGitignoredFiles}
setHideGitignoredFiles={handleGitignoredVisibilityChange}
explicitOrganization={draft.explicitOrganization}
setExplicitOrganization={(value) => updateDraft('explicitOrganization', value)}
crashReporting={draft.crashReporting}
@@ -397,6 +410,8 @@ function SettingsBody({
setUiLanguage,
initialH1AutoRename,
setInitialH1AutoRename,
hideGitignoredFiles,
setHideGitignoredFiles,
explicitOrganization,
setExplicitOrganization,
crashReporting,
@@ -455,6 +470,14 @@ function SettingsBody({
/>
</SettingsSection>
<SettingsSection>
<VaultContentSettingsSection
t={t}
hideGitignoredFiles={hideGitignoredFiles}
setHideGitignoredFiles={setHideGitignoredFiles}
/>
</SettingsSection>
<SettingsSection>
<AiAgentSettingsSection
t={t}
@@ -733,6 +756,29 @@ function TitleSettingsSection({
)
}
function VaultContentSettingsSection({
t,
hideGitignoredFiles,
setHideGitignoredFiles,
}: Pick<SettingsBodyProps, 't' | 'hideGitignoredFiles' | 'setHideGitignoredFiles'>) {
return (
<>
<SectionHeading
title={t('settings.vaultContent.title')}
description={t('settings.vaultContent.description')}
/>
<SettingsSwitchRow
label={t('settings.vaultContent.hideGitignored')}
description={t('settings.vaultContent.hideGitignoredDescription')}
checked={hideGitignoredFiles}
onChange={setHideGitignoredFiles}
testId="settings-hide-gitignored-files"
/>
</>
)
}
function buildDefaultAiAgentOptions(aiAgentsStatus: AiAgentsStatus, t: Translate): Array<{ value: string; label: string }> {
return AI_AGENT_DEFINITIONS.map((definition) => {
const status = aiAgentsStatus[definition.id]