Notes/src/public/app/components/root_command_executor.ts

269 lines
8.2 KiB
TypeScript
Raw Normal View History

2022-12-01 13:07:23 +01:00
import Component from "./component.js";
import appContext, { type CommandData, type CommandListenerData } from "./app_context.js";
import dateNoteService from "../services/date_notes.js";
2020-12-05 23:00:28 +01:00
import treeService from "../services/tree.js";
2022-12-01 13:07:23 +01:00
import openService from "../services/open.js";
import protectedSessionService from "../services/protected_session.js";
import options from "../services/options.js";
import froca from "../services/froca.js";
import utils from "../services/utils.js";
import LlmChatPanel from "../widgets/llm_chat_panel.js";
import toastService from "../services/toast.js";
import noteCreateService from "../services/note_create.js";
2020-01-20 22:35:52 +01:00
export default class RootCommandExecutor extends Component {
editReadOnlyNoteCommand() {
const noteContext = appContext.tabManager.getActiveContext();
if (noteContext?.viewScope) {
noteContext.viewScope.readOnlyTemporarilyDisabled = true;
appContext.triggerEvent("readOnlyTemporarilyDisabled", { noteContext });
}
}
async showSQLConsoleCommand() {
const sqlConsoleNote = await dateNoteService.createSqlConsole();
if (!sqlConsoleNote) {
return;
}
const noteContext = await appContext.tabManager.openTabWithNoteWithHoisting(sqlConsoleNote.noteId, { activate: true });
2025-01-09 18:07:02 +02:00
appContext.triggerEvent("focusOnDetail", { ntxId: noteContext.ntxId });
}
2025-01-09 18:07:02 +02:00
async searchNotesCommand({ searchString, ancestorNoteId }: CommandListenerData<"searchNotes">) {
const searchNote = await dateNoteService.createSearchNote({ searchString, ancestorNoteId });
if (!searchNote) {
return;
}
// force immediate search
await froca.loadSearchNote(searchNote.noteId);
const noteContext = await appContext.tabManager.openTabWithNoteWithHoisting(searchNote.noteId, {
activate: true
});
2025-01-09 18:07:02 +02:00
appContext.triggerCommand("focusOnSearchDefinition", { ntxId: noteContext.ntxId });
}
2025-01-09 18:07:02 +02:00
async searchInSubtreeCommand({ notePath }: CommandListenerData<"searchInSubtree">) {
const noteId = treeService.getNoteIdFromUrl(notePath);
2020-12-05 23:00:28 +01:00
2025-01-09 18:07:02 +02:00
this.searchNotesCommand({ ancestorNoteId: noteId });
2020-12-05 23:00:28 +01:00
}
openNoteExternallyCommand() {
2021-05-22 12:35:41 +02:00
const noteId = appContext.tabManager.getActiveContextNoteId();
2023-09-07 06:33:51 +00:00
const mime = appContext.tabManager.getActiveContextNoteMime();
if (noteId) {
openService.openNoteExternally(noteId, mime || "");
}
}
2023-05-17 23:57:32 +02:00
2023-05-16 11:57:28 +00:00
openNoteCustomCommand() {
const noteId = appContext.tabManager.getActiveContextNoteId();
2023-09-07 06:33:51 +00:00
const mime = appContext.tabManager.getActiveContextNoteMime();
2023-05-16 11:57:28 +00:00
if (noteId) {
openService.openNoteCustom(noteId, mime || "");
2023-05-16 11:57:28 +00:00
}
}
2021-05-18 22:14:35 +02:00
enterProtectedSessionCommand() {
protectedSessionService.enterProtectedSession();
}
leaveProtectedSessionCommand() {
protectedSessionService.leaveProtectedSession();
}
hideLeftPaneCommand() {
options.save(`leftPaneVisible`, "false");
}
showLeftPaneCommand() {
options.save(`leftPaneVisible`, "true");
}
toggleLeftPaneCommand() {
2025-01-09 18:07:02 +02:00
options.toggle("leftPaneVisible");
}
2022-08-04 23:00:32 +02:00
2022-12-15 16:38:05 +01:00
async showBackendLogCommand() {
2025-01-09 18:07:02 +02:00
await appContext.tabManager.openTabWithNoteWithHoisting("_backendLog", { activate: true });
2022-12-15 16:38:05 +01:00
}
async showHelpCommand() {
2025-02-02 17:54:14 +02:00
await this.showAndHoistSubtree("_help");
}
2022-12-01 10:03:04 +01:00
async showLaunchBarSubtreeCommand() {
const rootNote = utils.isMobile() ? "_lbMobileRoot" : "_lbRoot";
await this.showAndHoistSubtree(rootNote);
this.showLeftPaneCommand();
2022-11-25 15:29:57 +01:00
}
2022-08-05 16:44:26 +02:00
2022-11-25 15:29:57 +01:00
async showShareSubtreeCommand() {
2025-01-09 18:07:02 +02:00
await this.showAndHoistSubtree("_share");
2022-11-25 15:29:57 +01:00
}
2022-08-05 16:44:26 +02:00
2022-11-25 15:29:57 +01:00
async showHiddenSubtreeCommand() {
2025-01-09 18:07:02 +02:00
await this.showAndHoistSubtree("_hidden");
2022-08-04 23:00:32 +02:00
}
2022-12-05 23:57:29 +01:00
2025-01-09 18:07:02 +02:00
async showOptionsCommand({ section }: CommandListenerData<"showOptions">) {
await appContext.tabManager.openContextWithNote(section || "_options", {
activate: true,
2025-01-09 18:07:02 +02:00
hoistedNoteId: "_options"
});
2022-12-15 16:38:05 +01:00
}
async showSQLConsoleHistoryCommand() {
2025-01-09 18:07:02 +02:00
await this.showAndHoistSubtree("_sqlConsole");
2022-12-15 16:38:05 +01:00
}
async showSearchHistoryCommand() {
2025-01-09 18:07:02 +02:00
await this.showAndHoistSubtree("_search");
2022-12-15 16:38:05 +01:00
}
async showAndHoistSubtree(subtreeNoteId: string) {
await appContext.tabManager.openContextWithNote(subtreeNoteId, {
activate: true,
hoistedNoteId: subtreeNoteId
});
}
2023-02-15 14:32:12 +01:00
async showNoteSourceCommand() {
const notePath = appContext.tabManager.getActiveContextNotePath();
if (notePath) {
await appContext.tabManager.openTabWithNoteWithHoisting(notePath, {
2023-04-03 23:47:24 +02:00
activate: true,
viewScope: {
2025-01-09 18:07:02 +02:00
viewMode: "source"
2023-04-03 23:47:24 +02:00
}
});
}
2022-12-05 23:57:29 +01:00
}
2023-03-20 23:11:32 +01:00
async showAttachmentsCommand() {
const notePath = appContext.tabManager.getActiveContextNotePath();
if (notePath) {
await appContext.tabManager.openTabWithNoteWithHoisting(notePath, {
2023-04-03 23:47:24 +02:00
activate: true,
viewScope: {
2025-01-09 18:07:02 +02:00
viewMode: "attachments"
2023-04-03 23:47:24 +02:00
}
});
}
}
async showAttachmentDetailCommand() {
const notePath = appContext.tabManager.getActiveContextNotePath();
if (notePath) {
await appContext.tabManager.openTabWithNoteWithHoisting(notePath, {
2023-04-03 23:47:24 +02:00
activate: true,
viewScope: {
2025-01-09 18:07:02 +02:00
viewMode: "attachments"
2023-04-03 23:47:24 +02:00
}
});
2023-03-20 23:11:32 +01:00
}
}
toggleTrayCommand() {
if (!utils.isElectron()) return;
2025-01-09 18:07:02 +02:00
const { BrowserWindow } = utils.dynamicRequire("@electron/remote");
const windows = BrowserWindow.getAllWindows() as Electron.BaseWindow[];
const isVisible = windows.every((w) => w.isVisible());
const action = isVisible ? "hide" : "show";
for (const window of windows) window[action]();
}
2025-02-14 13:55:04 +02:00
toggleZenModeCommand() {
const $body = $("body");
$body.toggleClass("zen");
const isEnabled = $body.hasClass("zen");
appContext.triggerEvent("zenModeChanged", { isEnabled });
2025-02-14 13:55:04 +02:00
}
2025-01-09 18:07:02 +02:00
firstTabCommand() {
this.#goToTab(1);
}
secondTabCommand() {
this.#goToTab(2);
}
thirdTabCommand() {
this.#goToTab(3);
}
fourthTabCommand() {
this.#goToTab(4);
}
fifthTabCommand() {
this.#goToTab(5);
}
sixthTabCommand() {
this.#goToTab(6);
}
seventhTabCommand() {
this.#goToTab(7);
}
eigthTabCommand() {
this.#goToTab(8);
}
ninthTabCommand() {
this.#goToTab(9);
}
lastTabCommand() {
this.#goToTab(Number.POSITIVE_INFINITY);
}
#goToTab(tabNumber: number) {
const mainNoteContexts = appContext.tabManager.getMainNoteContexts();
const index = tabNumber === Number.POSITIVE_INFINITY ? mainNoteContexts.length - 1 : tabNumber - 1;
const tab = mainNoteContexts[index];
2023-09-13 09:10:56 +02:00
if (tab) {
appContext.tabManager.activateNoteContext(tab.ntxId);
}
}
async createAiChatCommand() {
try {
// Create a new AI Chat note
const parentNoteId = appContext.tabManager.getActiveContextNotePath();
if (!parentNoteId) {
toastService.showError("No active note to create AI Chat under");
return;
}
const result = await noteCreateService.createNote(parentNoteId, {
title: "New AI Chat",
type: "aiChat",
content: JSON.stringify({
messages: [],
title: "New AI Chat"
})
});
if (!result.note) {
toastService.showError("Failed to create AI Chat note");
return;
}
await appContext.tabManager.openTabWithNoteWithHoisting(result.note.noteId, {
activate: true
});
toastService.showMessage("Created new AI Chat note");
}
catch (e) {
console.error("Error creating AI Chat note:", e);
toastService.showError("Failed to create AI Chat note: " + (e as Error).message);
}
}
2020-07-04 10:18:01 +02:00
}