FN-7062: rename remote settings section
Rename the settings navigation entry so Remote Access is no longer conflated with Node Sync. - Update the remote settings nav label to "Remote Access" while keeping the separate Node Sync section intact. - Add coverage that rejects the old combined label and confirms both standalone entries render. - Align the workflow settings plan and changeset with the clarified settings IA. Files changed: .changeset/fn-7062-remote-access-rename.md | 7 +++++++ ...26-06-04-002-feat-workflow-settings-mechanism-plan.md | 2 +- packages/dashboard/app/components/SettingsModal.tsx | 6 +++++- .../__tests__/SettingsModal.scheduling-merge.test.tsx | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7062 Fusion-Task-Lineage: d50d47eb-aa15-4bf6-8f26-edaa79c8de9e
This commit is contained in:
7
.changeset/fn-7062-remote-access-rename.md
Normal file
7
.changeset/fn-7062-remote-access-rename.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"@runfusion/fusion": patch
|
||||
---
|
||||
|
||||
summary: Rename the Remote Access settings section (drops the stale "& Node Sync" suffix).
|
||||
category: fix
|
||||
dev: The standalone Node Sync settings section is unchanged.
|
||||
@@ -294,7 +294,7 @@ The schema-object key removal (from `DEFAULT_PROJECT_SETTINGS`) ships in the sam
|
||||
- **Requirements:** R9, R10, R11
|
||||
- **Dependencies:** U4, U5, U8
|
||||
- **Files:** `packages/dashboard/app/components/SettingsModal.tsx`, `packages/dashboard/app/components/SettingsModal.css`, `packages/dashboard/app/components/settings/sections/` (new per-section components + CSS), `packages/dashboard/app/hooks/useAppSettings.ts`, `packages/dashboard/app/__tests__/SettingsModal.test.tsx`
|
||||
- **Approach:** Keep the proven shell mechanics — `SETTINGS_SECTIONS` nav model with group headers, `visibleSections` gating, save-splitting via `isGlobalSettingsKey`/`isProjectSettingsKey`, null-as-delete, changed-only project writes — but extract each section into a descriptor-driven component under `settings/sections/`. Remove moved settings from their sections; where a section's content moved wholesale (per-phase model lanes, step-execution and review knobs), render a redirect stub row that opens the workflow editor with the Settings panel pre-selected via a query/hash param (e.g. `?panel=settings`, read by `WorkflowNodeEditor` on mount — deterministic and testable), targeting the project's default workflow (one release, per KTD-5). Target IA for the regroup (group headers → sections): **Account** (Authentication); **Global** — General, Appearance, Models & Providers (merging global-models + openrouter + onboarding), Notifications (ntfy/webhook/failure), Research, Remote Access & Node Sync (merging remote + node-sync), Experimental; **Runtimes** unchanged; **Project** — General, Commands & Scripts, Git & Worktrees, Scheduling & Capacity, GitHub Integration, Agents & Permissions, Memory & Backups, Research, Secrets, Plugins. Former project-models and review/step sections collapse into redirect stubs under Project. Section renames keep stable section `id`s where a section survives so deep links and `DEFAULT_SETTINGS_SECTION` stay valid. Device-local three-tier prefs (theme/language/font scale) keep their hooks untouched. The 7,900-line file shrinks to shell + imports.
|
||||
- **Approach:** Keep the proven shell mechanics — `SETTINGS_SECTIONS` nav model with group headers, `visibleSections` gating, save-splitting via `isGlobalSettingsKey`/`isProjectSettingsKey`, null-as-delete, changed-only project writes — but extract each section into a descriptor-driven component under `settings/sections/`. Remove moved settings from their sections; where a section's content moved wholesale (per-phase model lanes, step-execution and review knobs), render a redirect stub row that opens the workflow editor with the Settings panel pre-selected via a query/hash param (e.g. `?panel=settings`, read by `WorkflowNodeEditor` on mount — deterministic and testable), targeting the project's default workflow (one release, per KTD-5). Target IA for the regroup (group headers → sections): **Account** (Authentication); **Global** — General, Appearance, Models & Providers (merging global-models + openrouter + onboarding), Notifications (ntfy/webhook/failure), Research, Remote Access, Node Sync (kept as distinct remote + node-sync entries), Experimental; **Runtimes** unchanged; **Project** — General, Commands & Scripts, Git & Worktrees, Scheduling & Capacity, GitHub Integration, Agents & Permissions, Memory & Backups, Research, Secrets, Plugins. Former project-models and review/step sections collapse into redirect stubs under Project. Section renames keep stable section `id`s where a section survives so deep links and `DEFAULT_SETTINGS_SECTION` stay valid. Device-local three-tier prefs (theme/language/font scale) keep their hooks untouched. The 7,900-line file shrinks to shell + imports.
|
||||
- **Execution note:** Land section-by-section in reviewable slices rather than one mega-commit — this is the branch most exposed to the extraction-vs-semantics merge hazard; if `main` changes a setting's behavior mid-flight, port the semantic change to the section's new home and run the union suite.
|
||||
- **Test scenarios:**
|
||||
- Save-split regression: editing one global + one project setting in the same session produces the same `updateGlobalSettings`/`updateSettings` patches as before the redesign (characterization of the split function).
|
||||
|
||||
@@ -235,7 +235,11 @@ const SETTINGS_SECTIONS: SettingsSection[] = [
|
||||
{ id: "global-mcp", label: "MCP Servers", labelKey: "settings.nav.globalMcp", scope: "global" },
|
||||
{ id: "cli-agents", label: "CLI Agents", labelKey: "settings.nav.cliAgents", scope: "global" },
|
||||
{ id: "research-global", label: "Research Defaults", labelKey: "settings.nav.researchGlobal", scope: "global" },
|
||||
{ id: "remote", label: "Remote Access & Node Sync", labelKey: "settings.nav.remote", scope: "global" },
|
||||
/*
|
||||
FNXC:SettingsNavigation 2026-06-26-09:20:
|
||||
FN-7062 requires the remote settings nav entry to read "Remote Access" only. The stale "& Node Sync" suffix belongs to the separate Node Sync settings section, while this section body already uses the Remote Access heading.
|
||||
*/
|
||||
{ id: "remote", label: "Remote Access", labelKey: "settings.nav.remote", scope: "global" },
|
||||
{ id: "experimental", label: "Experimental Features", labelKey: "settings.nav.experimental", scope: "global" },
|
||||
|
||||
// Runtimes group (plugin runtimes with their own settings)
|
||||
|
||||
@@ -1409,6 +1409,22 @@ describe("SettingsModal", () => {
|
||||
expect(await screen.findByRole("button", { name: /Remote Access/i })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("labels the remote nav entry independently from the standalone Node Sync entry", async () => {
|
||||
mockFetchSettings.mockResolvedValue({
|
||||
...defaultSettings,
|
||||
experimentalFeatures: {},
|
||||
});
|
||||
|
||||
renderModal();
|
||||
await waitForSettingsModalReady();
|
||||
|
||||
// Desktop and mobile settings navs share SETTINGS_SECTIONS, so this single render guards the shared label source.
|
||||
expect(screen.getByRole("button", { name: "Remote Access" })).toBeInTheDocument();
|
||||
expect(screen.queryByRole("button", { name: /Remote Access & Node Sync/i })).not.toBeInTheDocument();
|
||||
expect(screen.queryByRole("button", { name: /& Node Sync/i })).not.toBeInTheDocument();
|
||||
expect(screen.getByRole("button", { name: "Node Sync" })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it.each([
|
||||
["experimentalFeatures undefined", undefined],
|
||||
["experimentalFeatures empty", {}],
|
||||
|
||||
Reference in New Issue
Block a user