Add more settings

This commit is contained in:
Silvano Cerza 2025-01-05 17:33:14 +01:00
parent 7ab945ca80
commit b84361b519
2 changed files with 154 additions and 50 deletions

View file

@ -3,6 +3,10 @@ export interface GitHubSyncSettings {
githubOwner: string;
githubRepo: string;
githubBranch: string;
repoContentPath: string;
localPath: string;
syncStrategy: "save" | "manual" | "interval";
syncInterval: number;
}
export const DEFAULT_SETTINGS: GitHubSyncSettings = {
@ -10,4 +14,8 @@ export const DEFAULT_SETTINGS: GitHubSyncSettings = {
githubOwner: "",
githubRepo: "",
githubBranch: "main",
repoContentPath: "",
localPath: "",
syncStrategy: "save",
syncInterval: 1,
};

View file

@ -1,39 +1,5 @@
import { PluginSettingTab, App, Setting } from "obsidian";
import { PluginSettingTab, App, Setting, TextComponent } from "obsidian";
import GitHubSyncPlugin from "src/main";
import { GitHubSyncSettings } from "./settings";
const SETTINGS_DATA: {
Name: string;
Description: string;
Field: keyof GitHubSyncSettings;
Placeholder: string;
}[] = [
{
Name: "GitHub Token",
Description:
"A personal access token or a fine-grained token with read and write access to your repository",
Field: "githubToken",
Placeholder: "Token",
},
{
Name: "Owner",
Description: "Owner of the repository to sync",
Field: "githubOwner",
Placeholder: "Owner",
},
{
Name: "Repository",
Description: "Name of the repository to sync",
Field: "githubRepo",
Placeholder: "Repository",
},
{
Name: "Repository branch",
Description: "Branch to sync",
Field: "githubBranch",
Placeholder: "Branch name",
},
];
export default class GitHubSyncSettingsTab extends PluginSettingTab {
plugin: GitHubSyncPlugin;
@ -48,21 +14,151 @@ export default class GitHubSyncSettingsTab extends PluginSettingTab {
containerEl.empty();
containerEl.createEl("h2", { text: "Settings for GitHub Sync" });
containerEl.createEl("h1", { text: "GitHub Sync Settings" });
SETTINGS_DATA.forEach((setting) => {
new Setting(containerEl)
.setName(setting.Name)
.setDesc(setting.Description)
.addText((text) =>
text
.setPlaceholder(setting.Placeholder)
.setValue(this.plugin.settings[setting.Field])
.onChange(async (value) => {
this.plugin.settings[setting.Field] = value;
await this.plugin.saveSettings();
}),
);
});
containerEl.createEl("h2", { text: "Repository settings" });
let tokenInput: TextComponent;
new Setting(containerEl)
.setName("GitHub Token")
.setDesc(
"A personal access token or a fine-grained token with read and write access to your repository",
)
.addButton((button) =>
button.setIcon("eye-off").onClick((e) => {
if (tokenInput.inputEl.type === "password") {
tokenInput.inputEl.type = "text";
button.setIcon("eye");
} else {
tokenInput.inputEl.type = "password";
button.setIcon("eye-off");
}
}),
)
.addText((text) => {
text
.setPlaceholder("Token")
.setValue(this.plugin.settings.githubToken)
.onChange(async (value) => {
this.plugin.settings.githubToken = value;
await this.plugin.saveSettings();
}).inputEl.type = "password";
tokenInput = text;
});
new Setting(containerEl)
.setName("Owner")
.setDesc("Owner of the repository to sync")
.addText((text) =>
text
.setPlaceholder("Owner")
.setValue(this.plugin.settings.githubOwner)
.onChange(async (value) => {
this.plugin.settings.githubOwner = value;
await this.plugin.saveSettings();
}),
);
new Setting(containerEl)
.setName("Repository")
.setDesc("Name of the repository to sync")
.addText((text) =>
text
.setPlaceholder("Repository")
.setValue(this.plugin.settings.githubRepo)
.onChange(async (value) => {
this.plugin.settings.githubRepo = value;
await this.plugin.saveSettings();
}),
);
new Setting(containerEl)
.setName("Repository branch")
.setDesc("Branch to sync")
.addText((text) =>
text
.setPlaceholder("Branch name")
.setValue(this.plugin.settings.githubBranch)
.onChange(async (value) => {
this.plugin.settings.githubBranch = value;
await this.plugin.saveSettings();
}),
);
containerEl.createEl("h2", { text: "Sync settings" });
new Setting(containerEl)
.setName("Repository content path")
.setDesc(
`The path to sync, relative to the repository root.
If not set the whole repository will be synced.`,
)
.addText((text) =>
text
.setPlaceholder("Exaple: blog/content")
.setValue(this.plugin.settings.repoContentPath)
.onChange(async (value) => {
// TODO: Change the local path if already fetched
this.plugin.settings.repoContentPath = value;
await this.plugin.saveSettings();
}),
);
new Setting(containerEl)
.setName("Local path")
.setDesc(
`The local path to sync, relative to the vault root.
Defaults to the repository name if not set.`,
)
.addText((text) =>
text
.setPlaceholder("Exaple: folder/blog-posts")
.setValue(this.plugin.settings.localPath)
.onChange(async (value) => {
// TODO: Move the folder if already fetched
this.plugin.settings.localPath = value;
await this.plugin.saveSettings();
}),
);
const saveStrategies = {
save: "On file save",
manual: "Manually",
interval: "On Interval",
};
const saveStrategySetting = new Setting(containerEl)
.setName("Sync strategy")
.setDesc("When to sync the local files with the remote repository");
let syncInterval = "1";
if (this.plugin.settings.syncInterval) {
syncInterval = this.plugin.settings.syncInterval.toString();
}
const intervalSettings = new Setting(containerEl)
.setName("Sync interval")
.setDesc("Sync interval in minutes between automatic synchronizations")
.addText((text) =>
text
.setPlaceholder("Interval in minutes")
.setValue(syncInterval)
.onChange(async (value) => {
this.plugin.settings.syncInterval = parseInt(value) || 1;
await this.plugin.saveSettings();
}),
);
intervalSettings.setDisabled(
this.plugin.settings.syncStrategy !== "interval",
);
saveStrategySetting.addDropdown((dropdown) =>
dropdown
.addOptions(saveStrategies)
.setValue(this.plugin.settings.syncStrategy)
.onChange(async (value: keyof typeof saveStrategies) => {
intervalSettings.setDisabled(value !== "interval");
this.plugin.settings.syncStrategy = value;
await this.plugin.saveSettings();
}),
);
}
}