Files
beaver-calendar/src/settings.ts
T
2026-08-08 16:30:22 +02:00

112 lines
3.4 KiB
TypeScript

import { PluginSettingTab, Setting } from "obsidian";
import type { App } from "obsidian";
import type BeaverCalendarPlugin from "./main";
export type ViewMode = "list" | "calendar";
export type GroupBy = "sphere" | "project" | "status" | "due";
export type SortBy = "manual" | "priority" | "due";
export interface BeaverCalendarSettings {
boardsFolder: string;
archiveHeading: string;
view: ViewMode;
groupBy: GroupBy;
listSort: SortBy;
calendarSort: SortBy;
showDone: boolean;
includeArchive: boolean;
railCollapsed: boolean;
undatedCollapsed: boolean;
}
export const DEFAULT_SETTINGS: BeaverCalendarSettings = {
boardsFolder: "Boards",
archiveHeading: "Archive",
view: "list",
groupBy: "sphere",
listSort: "due",
calendarSort: "priority",
showDone: false,
includeArchive: false,
railCollapsed: false,
undatedCollapsed: false,
};
export function normalizeFolder(value: string): string {
return value.trim().replace(/^\/+/u, "").replace(/\/+$/u, "");
}
export class BeaverCalendarSettingsTab extends PluginSettingTab {
constructor(
app: App,
private readonly plugin: BeaverCalendarPlugin,
) {
super(app, plugin);
}
display(): void {
const { containerEl } = this;
containerEl.empty();
new Setting(containerEl)
.setName("Boards folder")
.setDesc(
"Every markdown file in this folder is a sphere, and every second-level heading inside it is a project.",
)
.addText((text) =>
text
.setPlaceholder("Boards")
.setValue(this.plugin.settings.boardsFolder)
.onChange(async (value) => {
this.plugin.settings.boardsFolder = normalizeFolder(value);
await this.plugin.saveSettings();
await this.plugin.store.reloadAll();
}),
);
new Setting(containerEl)
.setName("Archive heading")
.setDesc("The lane completed tasks are moved to by the archive command.")
.addText((text) =>
text
.setPlaceholder("Archive")
.setValue(this.plugin.settings.archiveHeading)
.onChange(async (value) => {
this.plugin.settings.archiveHeading = value.trim() || "Archive";
await this.plugin.saveSettings();
}),
);
new Setting(containerEl)
.setName("Include the archive")
.setDesc(
"Widen the show-completed toggle to reach tasks below the archive " +
"separator. With this off, show-completed only reveals completed " +
"tasks still sitting in their lanes. Archived tasks carry an " +
"Archive badge instead of a project one.",
)
.addToggle((toggle) =>
toggle
.setValue(this.plugin.settings.includeArchive)
.onChange(async (value) => {
this.plugin.settings.includeArchive = value;
this.plugin.store.includeArchive = value;
await this.plugin.saveSettings();
}),
);
new Setting(containerEl)
.setName("Show completed")
.setDesc("Completed tasks are hidden from the list and the calendar by default.")
.addToggle((toggle) =>
toggle
.setValue(this.plugin.settings.showDone)
.onChange(async (value) => {
this.plugin.settings.showDone = value;
this.plugin.store.showDone = value;
await this.plugin.saveSettings();
}),
);
}
}