From d11b2c45783f3f5bc6614d858437487aad3b30c0 Mon Sep 17 00:00:00 2001 From: Nishant Mittal Date: Mon, 16 Sep 2024 01:21:36 +0530 Subject: [PATCH] feat(#51): add support for clearing defaults for a notebook and misc improvements --- src/index.ts | 41 +++++++++----- src/utils/defaultTemplates.ts | 101 ++++++++++++++++++++++++++++++++++ src/utils/templates.ts | 88 ----------------------------- 3 files changed, 129 insertions(+), 101 deletions(-) create mode 100644 src/utils/defaultTemplates.ts diff --git a/src/index.ts b/src/index.ts index ce48595..995ef80 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,8 @@ import { MenuItemLocation, SettingItemType } from "api/types"; import { Parser } from "./parser"; import { DateAndTimeUtils } from "./utils/dateAndTime"; import { getFolderFromId, getSelectedFolder, getUserFolderSelection, Folder } from "./utils/folders"; -import { getTemplateFromId, getUserDefaultTemplateTypeSelection, getUserTemplateSelection, setDefaultTemplate, Note, DefaultTemplatesConfigSetting } from "./utils/templates"; +import { clearDefaultTemplates, getNotebookDefaultTemplatesConfig, getUserDefaultTemplateTypeSelection, setDefaultTemplate, DefaultTemplatesConfigSetting } from "./utils/defaultTemplates"; +import { getTemplateFromId, getUserTemplateSelection, Note } from "./utils/templates"; import { setDefaultTemplatesView, DefaultTemplatesDisplayData, NotebookDefaultTemplatesDisplayData } from "./views/defaultTemplates"; import { TemplateAction, performAction } from "./actions"; import { loadLegacyTemplates } from "./legacyTemplates"; @@ -109,8 +110,11 @@ joplin.plugins.register({ promiseGroup.set("todoTemplate", getTemplateFromId(defaultTemplateTodoId)); const { notebook, noteTemplate, todoTemplate } = await promiseGroup.groupAll(); - // TODO: We can remove the deleted notebooks from settings storage. - if (notebook === null) return null; + if (notebook === null || (noteTemplate === null && todoTemplate === null)) { + // Async remove of the obsolete config + clearDefaultTemplates(notebookId); + return null; + } return { notebookTitle: notebook.title, defaultNoteTemplateTitle: noteTemplate ? noteTemplate.title : null, @@ -160,9 +164,7 @@ joplin.plugins.register({ execute: async () => { const noteTemplate = await getTemplateFromId(await joplin.settings.value("defaultNoteTemplateId")); const todoTemplate = await getTemplateFromId(await joplin.settings.value("defaultTodoTemplateId")); - - let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); - if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; + const defaultTemplatesConfig = await getNotebookDefaultTemplatesConfig(); const globalDefaultTemplates: DefaultTemplatesDisplayData = { defaultNoteTemplateTitle: noteTemplate ? noteTemplate.title : null, @@ -208,16 +210,27 @@ joplin.plugins.register({ } })); + joplinCommands.add(joplin.commands.register({ + name: "clearDefaultTemplatesForNotebook", + label: "Clear default templates for notebook", + execute: async () => { + const folder: Folder | null = JSON.parse(await getUserFolderSelection()); + if (folder === null) return; + + await clearDefaultTemplates(folder.id); + await joplin.views.dialogs.showMessageBox(`Default templates for "${folder.title}" cleared successfully!`); + } + })); + joplinCommands.add(joplin.commands.register({ name: "createNoteFromDefaultTemplate", label: "Create note from default template", execute: async () => { let defaultTemplate: Note | null = null; - let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); - if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; - + const defaultTemplatesConfig = await getNotebookDefaultTemplatesConfig(); const currentFolderId = await getSelectedFolder(); + if (currentFolderId in defaultTemplatesConfig) { defaultTemplate = await getTemplateFromId(defaultTemplatesConfig[currentFolderId].defaultNoteTemplateId); } @@ -239,10 +252,9 @@ joplin.plugins.register({ execute: async () => { let defaultTemplate: Note | null = null; - let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); - if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; - + const defaultTemplatesConfig = await getNotebookDefaultTemplatesConfig(); const currentFolderId = await getSelectedFolder(); + if (currentFolderId in defaultTemplatesConfig) { defaultTemplate = await getTemplateFromId(defaultTemplatesConfig[currentFolderId].defaultTodoTemplateId); } @@ -314,7 +326,10 @@ joplin.plugins.register({ }, { commandName: "setDefaultTemplateForNotebook" - } + }, + { + commandName: "clearDefaultTemplatesForNotebook" + }, ] }, { diff --git a/src/utils/defaultTemplates.ts b/src/utils/defaultTemplates.ts new file mode 100644 index 0000000..d82a24d --- /dev/null +++ b/src/utils/defaultTemplates.ts @@ -0,0 +1,101 @@ +import joplin from "api"; + +export interface DefaultTemplatesConfigSetting { + [notebookId: string]: { + defaultNoteTemplateId: string | null; + defaultTodoTemplateId: string | null; + } +} + +export enum DefaultTemplateType { + Both, + Note, + Todo, +} + +export const getUserDefaultTemplateTypeSelection = async (promptLabel = "Applicable for:"): Promise => { + const defaultTypeOptions = [ + { + label: "Both notes & todos", + value: DefaultTemplateType.Both + }, + { + label: "Notes", + value: DefaultTemplateType.Note + }, + { + label: "Todos", + value: DefaultTemplateType.Todo + }, + ]; + + const { answer } = await joplin.commands.execute("showPrompt", { + label: promptLabel, + inputType: "dropdown", + value: defaultTypeOptions[0], + autocomplete: defaultTypeOptions + }); + + if (!answer) return null; + return answer.value; +} + +export const setDefaultTemplate = async (notebookId: string | null, templateId: string, defaultType: DefaultTemplateType): Promise => { + if (notebookId === null) { + // Global default + switch (defaultType) { + case DefaultTemplateType.Note: + await joplin.settings.setValue("defaultNoteTemplateId", templateId); + break; + case DefaultTemplateType.Todo: + await joplin.settings.setValue("defaultTodoTemplateId", templateId); + break; + case DefaultTemplateType.Both: + await joplin.settings.setValue("defaultNoteTemplateId", templateId); + await joplin.settings.setValue("defaultTodoTemplateId", templateId); + break; + default: + break; + } + } else { + // Notebook specific default + let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); + if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; + + if (!(notebookId in defaultTemplatesConfig)) { + defaultTemplatesConfig[notebookId] = { + defaultNoteTemplateId: null, + defaultTodoTemplateId: null + }; + } + + switch (defaultType) { + case DefaultTemplateType.Note: + defaultTemplatesConfig[notebookId].defaultNoteTemplateId = templateId; + break; + case DefaultTemplateType.Todo: + defaultTemplatesConfig[notebookId].defaultTodoTemplateId = templateId; + break; + case DefaultTemplateType.Both: + defaultTemplatesConfig[notebookId].defaultNoteTemplateId = templateId; + defaultTemplatesConfig[notebookId].defaultTodoTemplateId = templateId; + break; + default: + break; + } + + await joplin.settings.setValue("defaultTemplatesConfig", defaultTemplatesConfig); + } +} + +export const getNotebookDefaultTemplatesConfig = async (): Promise => { + let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); + if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; + return defaultTemplatesConfig; +} + +export const clearDefaultTemplates = async (notebookId: string): Promise => { + const defaultTemplatesConfig = await getNotebookDefaultTemplatesConfig(); + delete defaultTemplatesConfig[notebookId]; + await joplin.settings.setValue("defaultTemplatesConfig", defaultTemplatesConfig); +} diff --git a/src/utils/templates.ts b/src/utils/templates.ts index e10a9fc..ce20cae 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -8,19 +8,6 @@ export interface Note { body: string; } -export interface DefaultTemplatesConfigSetting { - [notebookId: string]: { - defaultNoteTemplateId: string | null; - defaultTodoTemplateId: string | null; - } -} - -export enum DefaultTemplateType { - Both, - Note, - Todo, -} - type NoteProperty = "body" | "id" | "title"; const removeDuplicateTemplates = (templates: Note[]) => { @@ -112,78 +99,3 @@ export const getTemplateFromId = async (templateId: string | null): Promise => { - const defaultTypeOptions = [ - { - label: "Both notes & todos", - value: DefaultTemplateType.Both - }, - { - label: "Notes", - value: DefaultTemplateType.Note - }, - { - label: "Todos", - value: DefaultTemplateType.Todo - }, - ]; - - const { answer } = await joplin.commands.execute("showPrompt", { - label: promptLabel, - inputType: "dropdown", - value: defaultTypeOptions[0], - autocomplete: defaultTypeOptions - }); - - if (!answer) return null; - return answer.value; -} - -export const setDefaultTemplate = async (notebookId: string | null, templateId: string, defaultType: DefaultTemplateType): Promise => { - if (notebookId === null) { - // Global default - switch (defaultType) { - case DefaultTemplateType.Note: - await joplin.settings.setValue("defaultNoteTemplateId", templateId); - break; - case DefaultTemplateType.Todo: - await joplin.settings.setValue("defaultTodoTemplateId", templateId); - break; - case DefaultTemplateType.Both: - await joplin.settings.setValue("defaultNoteTemplateId", templateId); - await joplin.settings.setValue("defaultTodoTemplateId", templateId); - break; - default: - break; - } - } else { - // Notebook specific default - let defaultTemplatesConfig: DefaultTemplatesConfigSetting | null = await joplin.settings.value("defaultTemplatesConfig"); - if (defaultTemplatesConfig === null) defaultTemplatesConfig = {}; - - if (!(notebookId in defaultTemplatesConfig)) { - defaultTemplatesConfig[notebookId] = { - defaultNoteTemplateId: null, - defaultTodoTemplateId: null - }; - } - - switch (defaultType) { - case DefaultTemplateType.Note: - defaultTemplatesConfig[notebookId].defaultNoteTemplateId = templateId; - break; - case DefaultTemplateType.Todo: - defaultTemplatesConfig[notebookId].defaultTodoTemplateId = templateId; - break; - case DefaultTemplateType.Both: - defaultTemplatesConfig[notebookId].defaultNoteTemplateId = templateId; - defaultTemplatesConfig[notebookId].defaultTodoTemplateId = templateId; - break; - default: - break; - } - - await joplin.settings.setValue("defaultTemplatesConfig", defaultTemplatesConfig); - } -}