FN-8335: surface settings defaults in help tips

Expose default and inheritance descriptions through consistent Settings help affordances.

- Move report-mode and per-action override descriptions into accessible help tips
- Cover default, override reset, and embedded PostgreSQL connection-cap help text
- Keep the settings-default description inventory aligned with rendered copy

Files changed:
 .../__tests__/SettingsModal.general.test.tsx       | 37 ++++++++++++++++++++++
 .../settings/sections/GeneralSection.tsx           | 28 +++++++++-------
 .../settings-default-descriptions.test.tsx         | 13 ++++----
 3 files changed, 60 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8335

Fusion-Task-Lineage: 7a8711be-8559-4799-afcd-8f22ac3adc2b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-07-18 18:19:12 -07:00
parent e2b5532290
commit a348428f32
3 changed files with 60 additions and 18 deletions

View File

@@ -1347,6 +1347,43 @@ describe("SettingsModal", () => {
}));
});
it("renders report-mode default help across unset, populated, and reset action overrides", async () => {
renderModal({ initialSection: "general" });
await waitForSettingsModalReady();
const reportMode = screen.getByLabelText("In-app report mode") as HTMLSelectElement;
expect(reportMode).toHaveValue("draft-review");
expect(screen.getByTestId("settings-help-reportMode")).toBeInTheDocument();
expect(screen.getByText(/Default: draft-review \(operator reviews a draft before filing\)/i).closest(".settings-help-bubble")).toBeTruthy();
const actionLabels = ["Bug", "Feedback", "Idea", "Help"];
const actionSelects = actionLabels.map((action) => screen.getByLabelText(`${action} report override`) as HTMLSelectElement);
for (const select of actionSelects) expect(select).toHaveValue("");
for (const action of ["bug", "feedback", "idea", "help"]) {
expect(screen.getByTestId(`settings-help-reportModeByAction-${action}`)).toBeInTheDocument();
}
const overrideHelp = screen.getAllByText(/No default — unset actions inherit reportMode/i);
expect(overrideHelp).toHaveLength(4);
for (const help of overrideHelp) expect(help.closest(".settings-help-bubble")).toBeTruthy();
fireEvent.change(actionSelects[0], { target: { value: "auto-file" } });
expect(actionSelects[0]).toHaveValue("auto-file");
expect(screen.getAllByText(/No default — unset actions inherit reportMode/i)).toHaveLength(4);
fireEvent.change(actionSelects[0], { target: { value: "" } });
for (const select of actionSelects) expect(select).toHaveValue("");
expect(screen.getAllByText(/No default — unset actions inherit reportMode/i)).toHaveLength(4);
});
it("renders embedded PostgreSQL connection-cap help from the English locale", async () => {
renderModal({ initialSection: "backups-global" });
await waitForSettingsModalReady();
expect(screen.getByLabelText("Embedded PostgreSQL connection cap")).toHaveValue(500);
expect(screen.getByTestId("settings-help-embeddedPostgresMaxConnections")).toBeInTheDocument();
expect(screen.getByText("Maximum server connections for Fusion's embedded PostgreSQL. Applies after restarting Fusion. Range: 32–2,000. Default: 500. External PostgreSQL uses its provider's connection limit.").closest(".settings-help-bubble")).toBeTruthy();
});
it("saves ephemeral agent toggle in project settings payload", async () => {
renderModal({ initialSection: "general" });
await waitForSettingsModalReady();

View File

@@ -299,21 +299,28 @@ export function GeneralSection({ form, setForm, projectId, addToast, prefixError
A privacy-safe draft review remains the project default, while each of
the four guided report actions can explicitly opt into direct filing.
Persist overrides as one map so the pipeline resolves them consistently.
FNXC:SettingsDefaults 2026-07-17-13:55:
FN-8335 restores FN-7505 default-value parity for reportMode and reportModeByAction.
Keep their translated default and inherit descriptions in SettingsHelpTip rather than inline
paragraphs, so every report control exposes the shared accessible help affordance.
*/}
{/*
FNXC:ReportPipeline 2026-07-18-12:40:
FN-8277 report mode is a plain Settings control; bind help to i18n paths that state the
draft-review default and the unset per-action override so settings-default-descriptions stays green.
*/}
<label htmlFor="reportMode">{t("settings.general.reportMode", "In-app report mode")}</label>
<div className="settings-field-label-row">
<label htmlFor="reportMode">{t("settings.general.reportMode", "In-app report mode")}</label>
<SettingsHelpTip settingKey="reportMode">{t("settings.general.reportModeHelp", "How in-app bug/feedback/idea/help reports are filed. Default: draft-review (operator reviews a draft before filing).")}</SettingsHelpTip>
</div>
<select id="reportMode" value={form.reportMode ?? "draft-review"} onChange={(e) => setForm((f) => ({ ...f, reportMode: e.target.value as "draft-review" | "auto-file" }))}>
<option value="draft-review">{t("settings.general.reportModeDraftReview", "Review draft before filing")}</option>
<option value="auto-file">{t("settings.general.reportModeAutoFile", "File automatically")}</option>
</select>
<p className="form-help">{t("settings.general.reportModeHelp", "How in-app bug/feedback/idea/help reports are filed. Default: draft-review (operator reviews a draft before filing).")}</p>
{(["bug", "feedback", "idea", "help"] as const).map((action) => (
<label key={action} htmlFor={`reportMode-${action}`}>
{t(`settings.general.reportModeOverride.${action}`, `${action[0].toUpperCase()}${action.slice(1)} report override`)}
<div key={action}>
<div className="settings-field-label-row">
<label htmlFor={`reportMode-${action}`}>
{t(`settings.general.reportModeOverride.${action}`, `${action[0].toUpperCase()}${action.slice(1)} report override`)}
</label>
<SettingsHelpTip settingKey={`reportModeByAction-${action}`}>{t("settings.general.reportModeByActionHelp", "Optional per-action override of the project report mode for bug, feedback, idea, or help. No default — unset actions inherit reportMode.")}</SettingsHelpTip>
</div>
<select id={`reportMode-${action}`} value={form.reportModeByAction?.[action] ?? ""} onChange={(e) => setForm((current) => {
const reportModeByAction = { ...current.reportModeByAction };
const selected = e.target.value as "" | "draft-review" | "auto-file";
@@ -325,9 +332,8 @@ export function GeneralSection({ form, setForm, projectId, addToast, prefixError
<option value="draft-review">{t("settings.general.reportModeDraftReview", "Review draft before filing")}</option>
<option value="auto-file">{t("settings.general.reportModeAutoFile", "File automatically")}</option>
</select>
</label>
</div>
))}
<p className="form-help">{t("settings.general.reportModeByActionHelp", "Optional per-action override of the project report mode for bug, feedback, idea, or help. No default — unset actions inherit reportMode.")}</p>
<SettingsToggleRow
descriptor={{
key: "reportRoadmapDedup",

View File

@@ -164,9 +164,9 @@ const SETTING_DESCRIPTION_KEYS: Record<string, string> = {
memoryBackupDir: "backups.directoryForMemoryBackupsRelativeToProjectRoot",
memoryBackupScope: "backups.memoryBackupScopeHint",
/*
FNXC:EmbeddedPostgres 2026-07-18-12:40:
feat(postgres) surfaces embeddedPostgresMaxConnections in DatabaseBackupsSection advanced
disclosure; map the existing help string so the DEFAULT_SETTINGS inventory stays complete.
FNXC:SettingsDefaults 2026-07-17-13:55:
FN-8335 restores FN-7505 default-value parity for the surfaced embeddedPostgresMaxConnections
control. The English locale description is the canonical rendered SettingsHelpTip copy and states Default: 500.
*/
embeddedPostgresMaxConnections: "database.embeddedConnectionCapHelp",
// MemorySection
@@ -263,10 +263,9 @@ const SETTING_DESCRIPTION_KEYS: Record<string, string> = {
githubImportAutoTranslate: "general.autoTranslateImportedIssuesHelp",
importTranslateTargetLocale: "general.translationTargetLanguageHelp",
/*
FNXC:ReportPipeline 2026-07-18-12:40:
FN-8277 surfaces reportMode + per-action overrides in GeneralSection; map them here so
DEFAULT_SETTINGS bookkeeping requires a default-stating description (draft-review project default;
reportModeByAction is unset until an action opts in).
FNXC:SettingsDefaults 2026-07-17-13:55:
FN-8335 restores FN-7505 default-value parity for the surfaced reportMode and reportModeByAction
controls. reportMode states the draft-review default; undefined per-action overrides state that unset actions inherit it.
*/
reportMode: "general.reportModeHelp",
reportModeByAction: "general.reportModeByActionHelp",