diff --git a/docs/adr/2026_07_multiple_remote_onboarding.md b/docs/adr/2026_07_multiple_remote_onboarding.md index db468c0d..ff07cdec 100644 --- a/docs/adr/2026_07_multiple_remote_onboarding.md +++ b/docs/adr/2026_07_multiple_remote_onboarding.md @@ -65,7 +65,7 @@ The special meaning would duplicate `activeConfigurationId`, make a user-visible ### Add profile naming and full list editing to onboarding -That would make the first-run path longer and duplicate the established Remote Databases interface. Automatic descriptive names and later renaming keep this change limited to data integrity and consistent selection. +That would make the first-run path longer and duplicate the established Saved connections interface. Automatic descriptive names and later renaming keep this change limited to data integrity and consistent selection. ### Replace the compatibility fields immediately @@ -81,7 +81,7 @@ The real-Obsidian onboarding E2E owns the invitation, dialogue presentation, saf ## Consequences -- Manual onboarding and the Remote Databases pane share one Commonlib profile contract. +- Manual onboarding and the Saved connections list share one Commonlib profile contract. - Existing profiles survive reconfiguration, and a newly configured connection becomes explicitly selectable. - Modern imports retain user-assigned profile identity and names. - Legacy Setup URIs continue to work through an isolated compatibility boundary. diff --git a/docs/settings.md b/docs/settings.md index b371d330..89836438 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -169,9 +169,9 @@ Show verbose log. Please enable when you report the logs ## 3. Remote Configuration -### 1. Remote Server +### 1. Connection settings -Self-hosted LiveSync supports multiple remote connection profiles under **Remote Server** -> **Remote Databases**. This allows you to save and switch between multiple databases or bucket configurations in a single vault. +Self-hosted LiveSync stores multiple remote connection profiles under **Connection settings** → **Saved connections**. Each profile represents a CouchDB database, an Object Storage connection, or a P2P configuration, and several profiles can be kept in one Vault. Each profile has an opaque identifier and a presentation name. The name does not need to be unique and is not used to select the profile. The main remote and the P2P remote are selected independently, so code and settings imports must preserve both selections rather than relying on a special identifier such as `default`. @@ -185,7 +185,7 @@ Each profile has an opaque identifier and a presentation name. The name does not Setting key: remoteType -The active remote server type. This is automatically projected to the legacy configuration when you activate a connection profile. +The active connection type. This is automatically projected to the legacy configuration when you activate a connection profile. ### 2. Notification diff --git a/src/common/messages/LiveSyncProvisionalMessages.ts b/src/common/messages/LiveSyncProvisionalMessages.ts index 0c9057ba..ad064588 100644 --- a/src/common/messages/LiveSyncProvisionalMessages.ts +++ b/src/common/messages/LiveSyncProvisionalMessages.ts @@ -66,6 +66,8 @@ export const liveSyncProvisionalEnglishMessages = { "This file has ${COUNT} unresolved versions. They will be reviewed one pair at a time.", "Sync now": "Sync now", "Apply pending changes now": "Apply pending changes now", + "Connection settings": "Connection settings", + "Saved connections": "Saved connections", } as const; export type LiveSyncProvisionalMessageKey = keyof typeof liveSyncProvisionalEnglishMessages; diff --git a/src/common/translation.unit.spec.ts b/src/common/translation.unit.spec.ts index 45fb4719..f2da8cee 100644 --- a/src/common/translation.unit.spec.ts +++ b/src/common/translation.unit.spec.ts @@ -30,6 +30,8 @@ describe("LiveSync-owned translation catalogue", () => { it("uses LiveSync-owned provisional English without extending Commonlib's message contract", () => { expect($msg("This file has unresolved conflicts.")).toBe("This file has unresolved conflicts."); expect($msg("More actions for ${DEVICE}", { DEVICE: "phone" })).toBe("More actions for phone"); + expect($msg("Connection settings")).toBe("Connection settings"); + expect($msg("Saved connections")).toBe("Saved connections"); expect( $msg("This file has ${COUNT} unresolved versions. They will be reviewed one pair at a time.", { COUNT: "3", diff --git a/src/modules/features/SettingDialogue/PaneRemoteConfig.ts b/src/modules/features/SettingDialogue/PaneRemoteConfig.ts index 4b1e9504..e3ae96f5 100644 --- a/src/modules/features/SettingDialogue/PaneRemoteConfig.ts +++ b/src/modules/features/SettingDialogue/PaneRemoteConfig.ts @@ -133,8 +133,8 @@ export function paneRemoteConfig( } { // TODO: very WIP. need to refactor the UI. - void addPanel(paneEl, $msg("obsidianLiveSyncSettingTab.titleRemoteServer"), () => {}).then((paneEl) => { - const actions = new Setting(paneEl).setName("Remote Databases"); + void addPanel(paneEl, $msg("Connection settings"), () => {}).then((paneEl) => { + const actions = new Setting(paneEl).setName($msg("Saved connections")); // actions.addButton((button) => // button // .setButtonText("Change Remote and Setup") diff --git a/test/e2e-obsidian/scripts/settings-ui.ts b/test/e2e-obsidian/scripts/settings-ui.ts index a0f1c791..93b85786 100644 --- a/test/e2e-obsidian/scripts/settings-ui.ts +++ b/test/e2e-obsidian/scripts/settings-ui.ts @@ -214,6 +214,17 @@ async function verifyEffectiveSettings(): Promise { throw new Error("The Change Log still contains a compatibility or release-note acknowledgement control."); } + await liveSyncSettings.locator('.sls-setting-menu-btn[title="Remote Configuration"]').click(); + const connectionPanel = liveSyncSettings + .locator("h4.sls-setting-panel-title") + .filter({ hasText: "Connection settings" }) + .locator(".."); + await connectionPanel.waitFor({ state: "visible", timeout: uiTimeoutMs }); + await connectionPanel.getByText("Saved connections", { exact: true }).waitFor({ + state: "visible", + timeout: uiTimeoutMs, + }); + await liveSyncSettings.locator('.sls-setting-menu-btn[title="Sync Settings"]').click(); const deletionPanel = liveSyncSettings .locator("h4.sls-setting-panel-title")