Skip to content

Commit 3890db6

Browse files
committed
fix the settings save edge case
1 parent 236ba2c commit 3890db6

File tree

4 files changed

+42
-26
lines changed

4 files changed

+42
-26
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ import { RulesSettings } from "./RulesSettings"
1717
type ExperimentalSettingsProps = HTMLAttributes<HTMLDivElement> & {
1818
experiments: Experiments
1919
setExperimentEnabled: SetExperimentEnabled
20+
hasUnsavedChanges?: boolean
2021
}
2122

2223
export const ExperimentalSettings = ({
2324
experiments,
2425
setExperimentEnabled,
26+
hasUnsavedChanges,
2527
className,
2628
...props
2729
}: ExperimentalSettingsProps) => {
@@ -68,7 +70,7 @@ export const ExperimentalSettings = ({
6870
})}
6971
</Section>
7072

71-
<RulesSettings className="mt-6" />
73+
<RulesSettings className="mt-6" hasUnsavedChanges={hasUnsavedChanges} />
7274
</div>
7375
)
7476
}

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

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import { Button } from "@/components/ui/button"
55
import { vscode } from "@/utils/vscode"
66
import { cn } from "@/lib/utils"
77
import { useExtensionState } from "@/context/ExtensionStateContext"
8-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui"
8+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, StandardTooltip } from "@/components/ui"
99

1010
import { SectionHeader } from "./SectionHeader"
1111
import { Section } from "./Section"
1212

13-
type RulesSettingsProps = HTMLAttributes<HTMLDivElement>
13+
type RulesSettingsProps = HTMLAttributes<HTMLDivElement> & {
14+
hasUnsavedChanges?: boolean
15+
}
1416

1517
interface RuleType {
1618
id: string
@@ -20,7 +22,7 @@ interface RuleType {
2022
exists?: boolean
2123
}
2224

23-
export const RulesSettings = ({ className, ...props }: RulesSettingsProps) => {
25+
export const RulesSettings = ({ className, hasUnsavedChanges, ...props }: RulesSettingsProps) => {
2426
const { t } = useAppTranslation()
2527
const [isGenerating, setIsGenerating] = useState(false)
2628
const [generationStatus, setGenerationStatus] = useState<{
@@ -287,25 +289,33 @@ export const RulesSettings = ({ className, ...props }: RulesSettingsProps) => {
287289
</SelectContent>
288290
</Select>
289291

290-
<Button
291-
onClick={handleGenerateRules}
292-
disabled={isGenerating || !selectedApiConfig}
293-
variant="default"
294-
size="default"
295-
className="w-full"
296-
title={t("settings:rules.generateButtonTooltip")}>
297-
{isGenerating ? (
298-
<>
299-
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
300-
{t("settings:rules.generating")}
301-
</>
302-
) : (
303-
<>
304-
<FileText className="mr-2 h-4 w-4" />
305-
{t("settings:rules.generateButton")}
306-
</>
307-
)}
308-
</Button>
292+
<StandardTooltip
293+
content={
294+
hasUnsavedChanges
295+
? t("settings:rules.unsavedChangesError")
296+
: t("settings:rules.generateButtonTooltip")
297+
}>
298+
<span className="w-full">
299+
<Button
300+
onClick={handleGenerateRules}
301+
disabled={isGenerating || !selectedApiConfig || hasUnsavedChanges}
302+
variant="default"
303+
size="default"
304+
className="w-full">
305+
{isGenerating ? (
306+
<>
307+
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
308+
{t("settings:rules.generating")}
309+
</>
310+
) : (
311+
<>
312+
<FileText className="mr-2 h-4 w-4" />
313+
{t("settings:rules.generateButton")}
314+
</>
315+
)}
316+
</Button>
317+
</span>
318+
</StandardTooltip>
309319
</div>
310320

311321
{isGenerating && (
@@ -316,8 +326,7 @@ export const RulesSettings = ({ className, ...props }: RulesSettingsProps) => {
316326

317327
{generationStatus.type === "success" && (
318328
<div className="text-vscode-testing-iconPassed text-sm">
319-
<p>{t("settings:rules.taskCreated")}</p>
320-
<p className="text-vscode-descriptionForeground">{generationStatus.message}</p>
329+
<p>{generationStatus.message || t("settings:rules.taskCreated")}</p>
321330
</div>
322331
)}
323332

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,11 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
689689

690690
{/* Experimental Section */}
691691
{activeTab === "experimental" && (
692-
<ExperimentalSettings setExperimentEnabled={setExperimentEnabled} experiments={experiments} />
692+
<ExperimentalSettings
693+
setExperimentEnabled={setExperimentEnabled}
694+
experiments={experiments}
695+
hasUnsavedChanges={isChangeDetected}
696+
/>
693697
)}
694698

695699
{/* Language Section */}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@
626626
"noWorkspaceDescription": "Please open a workspace folder to generate rules for your project.",
627627
"selectTypes": "Select rule types to generate:",
628628
"noRulesSelected": "Please select at least one rule type to generate",
629+
"unsavedChangesError": "Please save your settings before generating rules",
629630
"types": {
630631
"general": {
631632
"label": "General Rules",

0 commit comments

Comments
 (0)