- Fixed a problem with synchronisation taking a long time to start in some cases.
- Now we can disable E2EE encryption.
Improved:
- `Setup Wizard` is now more clear.
- `Minimal Setup` is now more simple.
- Self-hosted LiveSync now be able to use even if there are vaults with the same name.
- Now Self-hosted LiveSync waits until set-up is complete.
- Show reload prompts when possibly recommended while settings.
New feature:
- A guidance dialogue prompting for settings will be shown after the installation.
Changed
- Some setting names has been changed
This commit is contained in:
vorotamoroz
2024-02-20 05:13:53 +00:00
parent 1552fa9d9e
commit 65619c2478
13 changed files with 291 additions and 198 deletions
+101 -112
View File
@@ -26,6 +26,18 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
}
this.plugin.addLog(`Connected to ${db.info.db_name}`, LOG_LEVEL_NOTICE);
}
askReload() {
scheduleTask("configReload", 250, async () => {
if (await askYesNo(this.app, "Do you want to restart and reload Obsidian now?") == "yes") {
// @ts-ignore
this.app.commands.executeCommandById("app:reload")
}
})
}
closeSetting() {
// @ts-ignore
this.plugin.app.setting.close()
}
display(): void {
const { containerEl } = this;
let encrypt = this.plugin.settings.encrypt;
@@ -136,29 +148,27 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
const setupWizardEl = containerEl.createDiv();
setupWizardEl.createEl("h3", { text: "Setup wizard" });
new Setting(setupWizardEl)
.setName("Discard the existing configuration and set up")
.setName("Use the copied setup URI")
.setDesc("To setup Self-hosted LiveSync, this method is the most preferred one.")
.addButton((text) => {
// eslint-disable-next-line require-await
text.setButtonText("Next").onClick(async () => {
if (JSON.stringify(this.plugin.settings) != JSON.stringify(DEFAULT_SETTINGS)) {
this.plugin.replicator.closeReplication();
this.plugin.settings = { ...DEFAULT_SETTINGS };
this.plugin.saveSettings();
Logger("Configuration has been flushed, please open it again", LOG_LEVEL_NOTICE)
// @ts-ignore
this.plugin.app.setting.close()
} else {
containerEl.addClass("isWizard");
applyDisplayEnabled();
inWizard = true;
changeDisplay("0")
}
text.setButtonText("Use").onClick(async () => {
this.closeSetting();
await this.plugin.addOnSetup.command_openSetupURI();
})
})
if (this.plugin.settings.isConfigured) {
new Setting(setupWizardEl)
.setName("Copy current settings as a new setup URI")
.addButton((text) => {
text.setButtonText("Copy").onClick(async () => {
await this.plugin.addOnSetup.command_copySetupURI();
})
})
}
new Setting(setupWizardEl)
.setName("Do not discard the existing configuration and set up again")
.setName("Minimal setup")
.addButton((text) => {
text.setButtonText("Next").onClick(async () => {
text.setButtonText("Start").onClick(async () => {
this.plugin.settings.liveSync = false;
this.plugin.settings.periodicReplication = false;
this.plugin.settings.syncOnSave = false;
@@ -172,27 +182,34 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
applyDisplayEnabled();
inWizard = true;
changeDisplay("0")
})
})
const infoWarnForSubsequent = setupWizardEl.createEl("div", { text: `To set up second or subsequent device, please use 'Copy setup URI' and 'Open setup URI'` });
infoWarnForSubsequent.addClass("op-warn-info");
new Setting(setupWizardEl)
.setName("Copy setup URI")
.addButton((text) => {
text.setButtonText("Copy setup URI").onClick(() => {
// @ts-ignore
this.plugin.app.commands.executeCommandById("obsidian-livesync:livesync-copysetupuri")
if (!this.plugin.settings.isConfigured) {
new Setting(setupWizardEl)
.setName("Enable LiveSync on this device as the set-up was completed manually")
.addButton((text) => {
text.setButtonText("Enable").onClick(async () => {
this.plugin.settings.isConfigured = true;
await this.plugin.saveSettings();
this.askReload();
})
})
})
.addButton((text) => {
text.setButtonText("Open setup URI").onClick(() => {
// @ts-ignore
this.plugin.app.commands.executeCommandById("obsidian-livesync:livesync-opensetupuri")
}
if (this.plugin.settings.isConfigured) {
new Setting(setupWizardEl)
.setName("Discard exist settings and databases")
.addButton((text) => {
text.setButtonText("Discard").onClick(async () => {
if (await askYesNo(this.plugin.app, "Do you really want to discard exist settings and databases?") == "yes") {
this.plugin.settings = { ...DEFAULT_SETTINGS };
await this.plugin.saveSettingData();
await this.plugin.resetLocalDatabase();
// await this.plugin.initializeDatabase();
this.askReload();
}
}).setWarning()
})
})
}
setupWizardEl.createEl("h3", { text: "Online Tips" });
const repo = "vrtmrz/obsidian-livesync";
const topPath = "/docs/troubleshooting.md";
@@ -338,6 +355,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
new Setting(containerRemoteDatabaseEl)
.setName("Test Database Connection")
.setClass("wizardHidden")
.setDesc("Open database connection. If the remote database is not found and you have the privilege to create a database, the database will be created.")
.addButton((button) =>
button
@@ -349,8 +367,8 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
);
new Setting(containerRemoteDatabaseEl)
.setName("Check database configuration")
// .setDesc("Open database connection. If the remote database is not found and you have the privilege to create a database, the database will be created.")
.setName("Check and Fix database configuration")
.setDesc("Check the database configuration, and fix if there are any problems.")
.addButton((button) =>
button
.setButtonText("Check")
@@ -557,18 +575,18 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
passphraseSetting?.controlEl.toggleClass("sls-item-dirty", passphrase != this.plugin.settings.passphrase);
dynamicIteration?.controlEl.toggleClass("sls-item-dirty", useDynamicIterationCount != this.plugin.settings.useDynamicIterationCount);
usePathObfuscationEl?.controlEl.toggleClass("sls-item-dirty", usePathObfuscation != this.plugin.settings.usePathObfuscation);
if (encrypt != this.plugin.settings.encrypt ||
passphrase != this.plugin.settings.passphrase ||
useDynamicIterationCount != this.plugin.settings.useDynamicIterationCount ||
usePathObfuscation != this.plugin.settings.usePathObfuscation) {
applyE2EButtons.settingEl.removeClass("sls-setting-hidden");
} else {
applyE2EButtons.settingEl.addClass("sls-setting-hidden");
}
} else {
passphraseSetting.settingEl.addClass("sls-setting-hidden");
dynamicIteration.settingEl.addClass("sls-setting-hidden");
usePathObfuscationEl.settingEl.addClass("sls-setting-hidden");
}
if (encrypt != this.plugin.settings.encrypt ||
passphrase != this.plugin.settings.passphrase ||
useDynamicIterationCount != this.plugin.settings.useDynamicIterationCount ||
usePathObfuscation != this.plugin.settings.usePathObfuscation) {
applyE2EButtons.settingEl.removeClass("sls-setting-hidden");
} else {
applyE2EButtons.settingEl.addClass("sls-setting-hidden");
}
}
@@ -703,6 +721,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
this.plugin.settings.passphrase = passphrase;
this.plugin.settings.useDynamicIterationCount = useDynamicIterationCount;
this.plugin.settings.usePathObfuscation = usePathObfuscation;
this.plugin.settings.isConfigured = true;
await this.plugin.saveSettings();
updateE2EControls();
if (sendToServer) {
@@ -731,26 +750,23 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
this.plugin.settings.passphrase = passphrase;
this.plugin.settings.useDynamicIterationCount = useDynamicIterationCount;
this.plugin.settings.usePathObfuscation = usePathObfuscation;
this.plugin.settings.isConfigured = true;
Logger("All synchronization have been temporarily disabled. Please enable them after the fetching, if you need them.", LOG_LEVEL_NOTICE)
await this.plugin.saveSettings();
updateE2EControls();
applyDisplayEnabled();
// @ts-ignore
this.plugin.app.setting.close();
this.closeSetting();
await delay(2000);
await performRebuildDB(this.plugin, method);
}
let rebuildRemote = false;
new Setting(containerRemoteDatabaseEl)
.setName("")
.setClass("wizardOnly")
.addButton((button) =>
button
.setButtonText("Next")
.setClass("mod-cta")
.setCta()
.setDisabled(false)
.onClick(() => {
if (!this.plugin.settings.encrypt) {
@@ -759,33 +775,13 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
if (isCloudantURI(this.plugin.settings.couchDB_URI)) {
this.plugin.settings.customChunkSize = 0;
} else {
this.plugin.settings.customChunkSize = 100;
this.plugin.settings.customChunkSize = 50;
}
rebuildRemote = false;
changeDisplay("30")
})
);
new Setting(containerRemoteDatabaseEl)
.setName("")
.setClass("wizardOnly")
.addButton((button) =>
button
.setButtonText("Discard existing database and proceed")
.setDisabled(false)
.setWarning()
.onClick(() => {
if (!this.plugin.settings.encrypt) {
this.plugin.settings.passphrase = "";
}
if (isCloudantURI(this.plugin.settings.couchDB_URI)) {
this.plugin.settings.customChunkSize = 0;
} else {
this.plugin.settings.customChunkSize = 100;
}
rebuildRemote = true;
changeDisplay("30")
})
);
)
;
addScreenElement("0", containerRemoteDatabaseEl);
const containerGeneralSettingsEl = containerEl.createDiv();
@@ -1049,25 +1045,20 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
...presetAllDisabled
}
}
this.plugin.saveSettings();
await this.plugin.saveSettings();
this.display();
await this.plugin.realizeSettingSyncMode();
if (inWizard) {
// @ts-ignore
this.plugin.app.setting.close()
await this.plugin.resetLocalDatabase();
await this.plugin.initializeDatabase(true);
if (rebuildRemote) {
await this.plugin.markRemoteLocked();
await this.plugin.tryResetRemoteDatabase();
await this.plugin.markRemoteLocked();
await this.plugin.markRemoteResolved();
this.closeSetting();
if (!this.plugin.settings.isConfigured) {
this.plugin.settings.isConfigured = true;
await this.plugin.saveSettings();
await rebuildDB("localOnly");
Logger("All done! Please set up subsequent devices with 'Copy current settings as a new setup URI' and 'Use the copied setup URI'.", LOG_LEVEL_NOTICE);
await this.plugin.addOnSetup.command_openSetupURI();
} else {
this.askReload();
}
await this.plugin.replicate(true);
Logger("All done! Please set up subsequent devices with 'Copy setup URI' and 'Open setup URI'.", LOG_LEVEL_NOTICE);
// @ts-ignore
this.plugin.app.commands.executeCommandById("obsidian-livesync:livesync-copysetupuri")
}
})
);
@@ -1286,24 +1277,21 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
.addButton((button) => {
button.setButtonText("Merge")
.onClick(async () => {
// @ts-ignore
this.plugin.app.setting.close()
this.closeSetting()
await this.plugin.addOnSetup.configureHiddenFileSync("MERGE");
})
})
.addButton((button) => {
button.setButtonText("Fetch")
.onClick(async () => {
// @ts-ignore
this.plugin.app.setting.close()
this.closeSetting()
await this.plugin.addOnSetup.configureHiddenFileSync("FETCH");
})
})
.addButton((button) => {
button.setButtonText("Overwrite")
.onClick(async () => {
// @ts-ignore
this.plugin.app.setting.close()
this.closeSetting()
await this.plugin.addOnSetup.configureHiddenFileSync("OVERWRITE");
})
});
@@ -1694,6 +1682,18 @@ ${stringifyYaml(pluginConfig)}`;
c.addClass("op-warn");
}
}
new Setting(containerHatchEl)
.setName("Back to non-configured")
.addButton((button) =>
button
.setButtonText("Back")
.setDisabled(false)
.onClick(async () => {
this.plugin.settings.isConfigured = false;
await this.plugin.saveSettings();
this.askReload();
}));
const hatchWarn = containerHatchEl.createEl("div", { text: `To stop the boot up sequence for fixing problems on databases, you can put redflag.md on top of your vault (Rebooting obsidian is required).` });
hatchWarn.addClass("op-warn-info");
@@ -1844,12 +1844,7 @@ ${stringifyYaml(pluginConfig)}`;
toggle.setValue(this.plugin.settings.suspendFileWatching).onChange(async (value) => {
this.plugin.settings.suspendFileWatching = value;
await this.plugin.saveSettings();
scheduleTask("configReload", 250, async () => {
if (await askYesNo(this.app, "Do you want to restart and reload Obsidian now?") == "yes") {
// @ts-ignore
this.app.commands.executeCommandById("app:reload")
}
})
this.askReload();
})
);
new Setting(containerHatchEl)
@@ -1859,12 +1854,7 @@ ${stringifyYaml(pluginConfig)}`;
toggle.setValue(this.plugin.settings.suspendParseReplicationResult).onChange(async (value) => {
this.plugin.settings.suspendParseReplicationResult = value;
await this.plugin.saveSettings();
scheduleTask("configReload", 250, async () => {
if (await askYesNo(this.app, "Do you want to restart and reload Obsidian now?") == "yes") {
// @ts-ignore
this.app.commands.executeCommandById("app:reload")
}
})
this.askReload();
})
);
new Setting(containerHatchEl)
@@ -1949,7 +1939,7 @@ ${stringifyYaml(pluginConfig)}`;
let newDatabaseName = this.plugin.settings.additionalSuffixOfDatabaseName + "";
new Setting(containerHatchEl)
.setName("Database suffix")
.setDesc("LiveSync could not treat multiple vaults which have same name, please add some suffix from here.")
.setDesc("LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.")
.addText((text) => {
text.setPlaceholder("")
.setValue(newDatabaseName)
@@ -2163,8 +2153,7 @@ ${stringifyYaml(pluginConfig)}`;
.setDisabled(false)
.setWarning()
.onClick(async () => {
// @ts-ignore
this.plugin.app.setting.close()
this.closeSetting()
await this.plugin.dbGC();
})
);
@@ -2186,7 +2175,7 @@ ${stringifyYaml(pluginConfig)}`;
applyDisplayEnabled();
if (this.selectedScreen == "") {
if (lastVersion != this.plugin.settings.lastReadUpdates) {
if (JSON.stringify(this.plugin.settings) != JSON.stringify(DEFAULT_SETTINGS)) {
if (this.plugin.settings.isConfigured) {
changeDisplay("100");
} else {
changeDisplay("110")