131 lines
5.0 KiB
TypeScript
Raw Normal View History

2022-12-01 16:22:04 +01:00
import CalendarWidget from "../buttons/calendar.js";
import SpacerWidget from "../spacer.js";
import BookmarkButtons from "../bookmark_buttons.js";
import ProtectedSessionStatusWidget from "../buttons/protected_session_status.js";
import SyncStatusWidget from "../sync_status.js";
import BasicWidget from "../basic_widget.js";
2022-12-02 16:46:14 +01:00
import NoteLauncher from "../buttons/launcher/note_launcher.js";
import ScriptLauncher from "../buttons/launcher/script_launcher.js";
import CommandButtonWidget from "../buttons/command_button.js";
import utils from "../../services/utils.js";
2022-12-18 23:25:35 +01:00
import TodayLauncher from "../buttons/launcher/today_launcher.js";
2022-12-23 20:17:04 +01:00
import HistoryNavigationButton from "../buttons/history_navigation.js";
2024-11-23 09:34:26 +02:00
import QuickSearchLauncherWidget from "../quick_search_launcher.js";
import FNote from "../../entities/fnote.js";
import type { CommandNames } from "../../components/app_context.js";
interface InnerWidget extends BasicWidget {
settings?: {
2025-01-09 18:07:02 +02:00
titlePlacement: "bottom";
};
}
2022-12-01 16:22:04 +01:00
export default class LauncherWidget extends BasicWidget {
private innerWidget!: InnerWidget;
private isHorizontalLayout: boolean;
constructor(isHorizontalLayout: boolean) {
2022-12-01 16:22:04 +01:00
super();
2022-12-07 12:46:41 +01:00
this.isHorizontalLayout = isHorizontalLayout;
2022-12-01 16:22:04 +01:00
}
isEnabled() {
return this.innerWidget.isEnabled();
}
doRender() {
this.$widget = this.innerWidget.render();
}
async initLauncher(note: FNote) {
2025-01-09 18:07:02 +02:00
if (note.type !== "launcher") {
2022-12-02 16:46:14 +01:00
throw new Error(`Note '${note.noteId}' '${note.title}' is not a launcher even though it's in the launcher subtree`);
}
2022-12-01 16:22:04 +01:00
2025-01-09 18:07:02 +02:00
if (!utils.isDesktop() && note.isLabelTruthy("desktopOnly")) {
return false;
}
2022-12-02 16:46:14 +01:00
const launcherType = note.getLabelValue("launcherType");
2022-12-01 16:22:04 +01:00
2025-01-09 18:07:02 +02:00
if (glob.TRILIUM_SAFE_MODE && launcherType === "customWidget") {
return false;
}
let widget: BasicWidget;
2025-01-09 18:07:02 +02:00
if (launcherType === "command") {
widget = this.initCommandLauncherWidget(note).class("launcher-button");
} else if (launcherType === "note") {
widget = new NoteLauncher(note).class("launcher-button");
} else if (launcherType === "script") {
widget = new ScriptLauncher(note).class("launcher-button");
} else if (launcherType === "customWidget") {
widget = await this.initCustomWidget(note);
2025-01-09 18:07:02 +02:00
} else if (launcherType === "builtinWidget") {
widget = this.initBuiltinWidget(note);
2022-12-01 16:22:04 +01:00
} else {
2022-12-07 12:46:41 +01:00
throw new Error(`Unrecognized launcher type '${launcherType}' for launcher '${note.noteId}' title '${note.title}'`);
2022-12-01 16:22:04 +01:00
}
if (!widget) {
throw new Error(`Unknown initialization error for note '${note.noteId}', title '${note.title}'`);
2022-12-01 16:22:04 +01:00
}
this.child(widget);
this.innerWidget = widget as InnerWidget;
if (this.isHorizontalLayout && this.innerWidget.settings) {
this.innerWidget.settings.titlePlacement = "bottom";
}
return true;
2022-12-01 16:22:04 +01:00
}
initCommandLauncherWidget(note: FNote) {
2022-12-02 16:46:14 +01:00
return new CommandButtonWidget()
2022-12-23 20:17:04 +01:00
.title(() => note.title)
.icon(() => note.getIcon())
2025-01-07 14:58:19 +02:00
.command(() => note.getLabelValue("command") as CommandNames);
2022-12-02 16:46:14 +01:00
}
2022-12-01 16:22:04 +01:00
async initCustomWidget(note: FNote) {
2025-01-09 18:07:02 +02:00
const widget = await note.getRelationTarget("widget");
2022-12-01 16:22:04 +01:00
2022-12-02 16:46:14 +01:00
if (widget) {
return await widget.executeScript();
2022-12-01 16:22:04 +01:00
} else {
2022-12-02 16:46:14 +01:00
throw new Error(`Custom widget of launcher '${note.noteId}' '${note.title}' is not defined.`);
2022-12-01 16:22:04 +01:00
}
}
initBuiltinWidget(note: FNote) {
2022-12-02 16:46:14 +01:00
const builtinWidget = note.getLabelValue("builtinWidget");
switch (builtinWidget) {
case "calendar":
return new CalendarWidget(note.title, note.getIcon());
case "spacer":
// || has to be inside since 0 is a valid value
const baseSize = parseInt(note.getLabelValue("baseSize") || "40");
const growthFactor = parseInt(note.getLabelValue("growthFactor") || "100");
return new SpacerWidget(baseSize, growthFactor);
case "bookmarks":
return new BookmarkButtons(this.isHorizontalLayout);
case "protectedSession":
return new ProtectedSessionStatusWidget();
case "syncStatus":
return new SyncStatusWidget();
case "backInHistoryButton":
return new HistoryNavigationButton(note, "backInNoteHistory");
case "forwardInHistoryButton":
return new HistoryNavigationButton(note, "forwardInNoteHistory");
case "todayInJournal":
return new TodayLauncher(note);
case "quickSearch":
return new QuickSearchLauncherWidget(this.isHorizontalLayout);
default:
throw new Error(`Unrecognized builtin widget ${builtinWidget} for launcher ${note.noteId} "${note.title}"`);
2022-12-01 16:22:04 +01:00
}
}
}