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:
@@ -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();
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user