From 876e4f40e7485885e56ac97a70862eb504177397 Mon Sep 17 00:00:00 2001 From: Lost Paul <70213368+LostPaul@users.noreply.github.com> Date: Sun, 19 Mar 2023 23:11:00 +0100 Subject: [PATCH] New eslint rules --- .eslintrc | 159 ++++++++-- src/commands.ts | 68 ++--- src/main.ts | 390 ++++++++++++------------ src/modals/confirmCreation.ts | 86 +++--- src/modals/exludeFolderSettings.ts | 160 +++++----- src/modals/folderName.ts | 75 +++-- src/settings.ts | 450 ++++++++++++++-------------- src/suggesters/FileSuggester.ts | 72 ++--- src/suggesters/FolderSuggester.ts | 74 ++--- src/suggesters/suggest.ts | 318 ++++++++++---------- src/suggesters/templateSuggester.ts | 102 +++---- src/template.ts | 124 ++++---- 12 files changed, 1097 insertions(+), 981 deletions(-) diff --git a/.eslintrc b/.eslintrc index 0807290..6e5b797 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,23 +1,140 @@ { - "root": true, - "parser": "@typescript-eslint/parser", - "env": { "node": true }, - "plugins": [ - "@typescript-eslint" + "root": true, + "parser": "@typescript-eslint/parser", + "env": { + "node": true + }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none" + } ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "parserOptions": { - "sourceType": "module" - }, - "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], - "@typescript-eslint/ban-ts-comment": "off", - "no-prototype-builtins": "off", - "@typescript-eslint/no-empty-function": "off" - } - } \ No newline at end of file + "@typescript-eslint/ban-ts-comment": "off", + "no-prototype-builtins": "off", + "@typescript-eslint/no-empty-function": "off", + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "consistent-return": "off", + "quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "no-mixed-spaces-and-tabs": "error", + "indent": [ + "error", + "tab", + { + "SwitchCase": 1 + } + ], + "arrow-parens": [ + "error", + "always" + ], + "eol-last": [ + "error", + "always" + ], + "func-call-spacing": [ + "error", + "never" + ], + "comma-dangle": [ + "error", + "always-multiline" + ], + "no-multi-spaces": "error", + "no-trailing-spaces": "error", + "no-whitespace-before-property": "off", + "semi": [ + "error", + "always" + ], + "semi-style": [ + "error", + "last" + ], + "space-in-parens": [ + "error", + "never" + ], + "block-spacing": [ + "error", + "always" + ], + "object-curly-spacing": [ + "error", + "always" + ], + "eqeqeq": [ + "error", + "always", + { + "null": "ignore" + } + ], + "spaced-comment": [ + "error", + "always", + { + "markers": [ + "!" + ] + } + ], + "yoda": "error", + "prefer-destructuring": [ + "error", + { + "object": false, + "array": false + } + ], + "operator-assignment": [ + "error", + "always" + ], + "no-useless-computed-key": "error", + "no-unneeded-ternary": [ + "error", + { + "defaultAssignment": false + } + ], + "no-invalid-regexp": "error", + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], + "no-duplicate-imports": "error", + "no-extra-semi": "error", + "dot-notation": "error", + "no-useless-escape": [ + "error" + ] + } +} \ No newline at end of file diff --git a/src/commands.ts b/src/commands.ts index c67d892..49a2a00 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -2,37 +2,37 @@ import { App, TFolder, Menu, TAbstractFile, Notice } from 'obsidian'; import FolderNotesPlugin from './main'; import { ExcludedFolder } from './settings'; export class Commands { - plugin: FolderNotesPlugin; - app: App; - constructor(app: App, plugin: FolderNotesPlugin) { - this.plugin = plugin; - this.app = app; - } - registerCommands() { - this.plugin.registerEvent(this.app.workspace.on('file-menu', (menu: Menu, file: TAbstractFile) => { - if (!(file instanceof TFolder)) return; - if (this.plugin.settings.excludeFolders.find((folder) => folder.path === file.path)) { - menu.addItem((item) => { - item.setTitle('Remove folder from excluded folders') - .setIcon('x') - .onClick(() => { - this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== file.path); - this.plugin.saveSettings(); - new Notice('Successfully removed folder from excluded folders'); - }); - }); - return; - } - menu.addItem((item) => { - item.setTitle('Exclude folder from folder notes') - .setIcon('x') - .onClick(() => { - const excludedFolder = new ExcludedFolder(file.path, this.plugin.settings.excludeFolders.length); - this.plugin.settings.excludeFolders.push(excludedFolder); - this.plugin.saveSettings(); - new Notice('Successfully excluded folder from folder notes'); - }); - }); - })); - } -} \ No newline at end of file + plugin: FolderNotesPlugin; + app: App; + constructor(app: App, plugin: FolderNotesPlugin) { + this.plugin = plugin; + this.app = app; + } + registerCommands() { + this.plugin.registerEvent(this.app.workspace.on('file-menu', (menu: Menu, file: TAbstractFile) => { + if (!(file instanceof TFolder)) return; + if (this.plugin.settings.excludeFolders.find((folder) => folder.path === file.path)) { + menu.addItem((item) => { + item.setTitle('Remove folder from excluded folders') + .setIcon('x') + .onClick(() => { + this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== file.path); + this.plugin.saveSettings(); + new Notice('Successfully removed folder from excluded folders'); + }); + }); + return; + } + menu.addItem((item) => { + item.setTitle('Exclude folder from folder notes') + .setIcon('x') + .onClick(() => { + const excludedFolder = new ExcludedFolder(file.path, this.plugin.settings.excludeFolders.length); + this.plugin.settings.excludeFolders.push(excludedFolder); + this.plugin.saveSettings(); + new Notice('Successfully excluded folder from folder notes'); + }); + }); + })); + } +} diff --git a/src/main.ts b/src/main.ts index 759cac0..4093e65 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,222 +1,222 @@ -import { Plugin, TFile, TFolder, TAbstractFile, Notice } from 'obsidian' -import { DEFAULT_SETTINGS, FolderNotesSettings, SettingsTab } from './settings' +import { Plugin, TFile, TFolder, TAbstractFile, Notice } from 'obsidian'; +import { DEFAULT_SETTINGS, FolderNotesSettings, SettingsTab } from './settings'; import FolderNameModal from './modals/folderName'; import { applyTemplate } from './template'; import { Commands } from './commands'; export default class FolderNotesPlugin extends Plugin { - observer: MutationObserver - folders: TFolder[] = [] - settings: FolderNotesSettings - settingsTab: SettingsTab; - async onload() { - console.log('loading folder notes plugin'); - await this.loadSettings(); - this.settingsTab = new SettingsTab(this.app, this); - this.addSettingTab(this.settingsTab); - document.body.classList.add('folder-notes-plugin') - if (this.settings.hideFolderNote) { - document.body.classList.add('hide-folder-note'); - } else { - document.body.classList.remove('hide-folder-note'); - } - new Commands(this.app, this).registerCommands(); - this.registerEvent(this.app.vault.on('create', (folder: TAbstractFile) => { - if (!this.app.workspace.layoutReady) return; - if (!this.settings.autoCreate) return; - if (!(folder instanceof TFolder)) return; + observer: MutationObserver; + folders: TFolder[] = []; + settings: FolderNotesSettings; + settingsTab: SettingsTab; + async onload() { + console.log('loading folder notes plugin'); + await this.loadSettings(); + this.settingsTab = new SettingsTab(this.app, this); + this.addSettingTab(this.settingsTab); + document.body.classList.add('folder-notes-plugin'); + if (this.settings.hideFolderNote) { + document.body.classList.add('hide-folder-note'); + } else { + document.body.classList.remove('hide-folder-note'); + } + new Commands(this.app, this).registerCommands(); + this.registerEvent(this.app.vault.on('create', (folder: TAbstractFile) => { + if (!this.app.workspace.layoutReady) return; + if (!this.settings.autoCreate) return; + if (!(folder instanceof TFolder)) return; - const excludedFolder = this.settings.excludeFolders.find( - (excludedFolder) => (excludedFolder.path === folder.path) || - (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf("/") >= 0 ? folder.path?.lastIndexOf("/") : folder.path.length) + const excludedFolder = this.settings.excludeFolders.find( + (excludedFolder) => (excludedFolder.path === folder.path) || + (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf('/') >= 0 ? folder.path?.lastIndexOf('/') : folder.path.length) && excludedFolder.subFolders)); - if (excludedFolder?.disableAutoCreate) return; + if (excludedFolder?.disableAutoCreate) return; - const path = folder.path + '/' + folder.name + '.md'; - if (!path) return; - const file = this.app.vault.getAbstractFileByPath(path); - if (file) return; - this.createFolderNote(path, true, true); + const path = folder.path + '/' + folder.name + '.md'; + if (!path) return; + const file = this.app.vault.getAbstractFileByPath(path); + if (file) return; + this.createFolderNote(path, true, true); - })); + })); - this.registerEvent(this.app.vault.on('rename', (file: TAbstractFile, oldPath: string) => { - if (!this.settings.syncFolderName) return; - if (file instanceof TFolder) { - const folder = this.app.vault.getAbstractFileByPath(file?.path); - if (!folder) return; - const excludedFolder = this.settings.excludeFolders.find( - (excludedFolder) => (excludedFolder.path === folder.path) || - (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf("/") >= 0 ? folder.path?.lastIndexOf("/") : folder.path.length) + this.registerEvent(this.app.vault.on('rename', (file: TAbstractFile, oldPath: string) => { + if (!this.settings.syncFolderName) return; + if (file instanceof TFolder) { + const folder = this.app.vault.getAbstractFileByPath(file?.path); + if (!folder) return; + const excludedFolder = this.settings.excludeFolders.find( + (excludedFolder) => (excludedFolder.path === folder.path) || + (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf('/') >= 0 ? folder.path?.lastIndexOf('/') : folder.path.length) && excludedFolder.subFolders)); - if (excludedFolder?.disableSync) return; - const excludedFolders = this.settings.excludeFolders.filter( - (excludedFolder) => excludedFolder.path.includes(oldPath) - ); + if (excludedFolder?.disableSync) return; + const excludedFolders = this.settings.excludeFolders.filter( + (excludedFolder) => excludedFolder.path.includes(oldPath) + ); - excludedFolders.forEach((excludedFolder) => { - const folders = excludedFolder.path.split('/'); - if (folders.length < 1) { - folders.push(excludedFolder.path); - } + excludedFolders.forEach((excludedFolder) => { + const folders = excludedFolder.path.split('/'); + if (folders.length < 1) { + folders.push(excludedFolder.path); + } - const oldName = oldPath.substring(oldPath.lastIndexOf('/' || '\\')); - folders[folders.indexOf(oldName.replace('/', ''))] = folder.name; - excludedFolder.path = folders.join('/'); - }); - this.saveSettings(); + const oldName = oldPath.substring(oldPath.lastIndexOf('/' || '\\')); + folders[folders.indexOf(oldName.replace('/', ''))] = folder.name; + excludedFolder.path = folders.join('/'); + }); + this.saveSettings(); - const oldName = oldPath.substring(oldPath.lastIndexOf('/' || '\\')); - const newPath = folder?.path + '/' + folder?.name + '.md'; - if (folder instanceof TFolder) { - const note = this.app.vault.getAbstractFileByPath(oldPath + '/' + oldName + '.md'); - if (!note) return; - (note as any).path = folder.path + '/' + oldName + '.md'; - if (note instanceof TFile) { - this.app.vault.rename(note, newPath); - } - } - } else if (file instanceof TFile) { - const folder = this.app.vault.getAbstractFileByPath(oldPath.substring(0, oldPath.lastIndexOf('/' || '\\'))); - if (folder?.name + '.md' == file.name) return; - const oldFileName = oldPath.substring(oldPath.lastIndexOf('/' || '\\') + 1); - if (!folder) return; - const excludedFolder = this.settings.excludeFolders.find( - (excludedFolder) => (excludedFolder.path === folder.path) || - (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf("/") >= 0 ? folder.path?.lastIndexOf("/") : folder.path.length) + const oldName = oldPath.substring(oldPath.lastIndexOf('/' || '\\')); + const newPath = folder?.path + '/' + folder?.name + '.md'; + if (folder instanceof TFolder) { + const note = this.app.vault.getAbstractFileByPath(oldPath + '/' + oldName + '.md'); + if (!note) return; + (note as any).path = folder.path + '/' + oldName + '.md'; + if (note instanceof TFile) { + this.app.vault.rename(note, newPath); + } + } + } else if (file instanceof TFile) { + const folder = this.app.vault.getAbstractFileByPath(oldPath.substring(0, oldPath.lastIndexOf('/' || '\\'))); + if (folder?.name + '.md' === file.name) return; + const oldFileName = oldPath.substring(oldPath.lastIndexOf('/' || '\\') + 1); + if (!folder) return; + const excludedFolder = this.settings.excludeFolders.find( + (excludedFolder) => (excludedFolder.path === folder.path) || + (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf('/') >= 0 ? folder.path?.lastIndexOf('/') : folder.path.length) && excludedFolder.subFolders)); - if (excludedFolder?.disableSync) return; - if (oldFileName !== folder?.name + '.md') return; - let newFolderPath = file.path.slice(0, file.path.lastIndexOf('/')) - if (newFolderPath.lastIndexOf('/') > 0) { - newFolderPath = newFolderPath.slice(0, newFolderPath.lastIndexOf('/')) + '/' - } else { - newFolderPath = '' - } - newFolderPath = newFolderPath + file.name.replace('.md', ''); - if (this.app.vault.getAbstractFileByPath(newFolderPath)) { - this.app.vault.rename(file, oldPath); - return new Notice('A folder with the same name already exists'); - } - if (folder instanceof TFolder) { - this.app.vault.rename(folder, folder.path.substring(0, folder.path.lastIndexOf('/' || '\\')) + '/' + file.name.substring(0, file.name.lastIndexOf('.'))); - } - } - })); + if (excludedFolder?.disableSync) return; + if (oldFileName !== folder?.name + '.md') return; + let newFolderPath = file.path.slice(0, file.path.lastIndexOf('/')); + if (newFolderPath.lastIndexOf('/') > 0) { + newFolderPath = newFolderPath.slice(0, newFolderPath.lastIndexOf('/')) + '/'; + } else { + newFolderPath = ''; + } + newFolderPath += file.name.replace('.md', ''); + if (this.app.vault.getAbstractFileByPath(newFolderPath)) { + this.app.vault.rename(file, oldPath); + return new Notice('A folder with the same name already exists'); + } + if (folder instanceof TFolder) { + this.app.vault.rename(folder, folder.path.substring(0, folder.path.lastIndexOf('/' || '\\')) + '/' + file.name.substring(0, file.name.lastIndexOf('.'))); + } + } + })); - this.observer = new MutationObserver((mutations: MutationRecord[]) => { - mutations.forEach((rec) => { - if (rec.type === 'childList') { - (rec.target).querySelectorAll('div.nav-folder-title-content') - .forEach((element: HTMLElement) => { - if (element.onclick) return; - element.onclick = (event: MouseEvent) => this.handleFolderClick(event); - }); - } - }) - }); - this.observer.observe(document.body, { - childList: true, - subtree: true, - }); - } + this.observer = new MutationObserver((mutations: MutationRecord[]) => { + mutations.forEach((rec) => { + if (rec.type === 'childList') { + (rec.target).querySelectorAll('div.nav-folder-title-content') + .forEach((element: HTMLElement) => { + if (element.onclick) return; + element.onclick = (event: MouseEvent) => this.handleFolderClick(event); + }); + } + }); + }); + this.observer.observe(document.body, { + childList: true, + subtree: true, + }); + } - async handleFolderClick(event: MouseEvent) { - if (!(event.target instanceof HTMLElement)) return; - event.stopImmediatePropagation(); - if (!document.body.classList.contains('folder-notes-plugin')) { - event.target.onclick = null; - event.target.click(); - return; - } + async handleFolderClick(event: MouseEvent) { + if (!(event.target instanceof HTMLElement)) return; + event.stopImmediatePropagation(); + if (!document.body.classList.contains('folder-notes-plugin')) { + event.target.onclick = null; + event.target.click(); + return; + } - const folder = event.target.parentElement?.getAttribute('data-path'); - const excludedFolder = this.settings.excludeFolders.find( - (excludedFolder) => (excludedFolder.path === folder) || - (excludedFolder.path === folder?.slice(0, folder?.lastIndexOf("/") >= 0 ? folder?.lastIndexOf("/") : folder.length) + const folder = event.target.parentElement?.getAttribute('data-path'); + const excludedFolder = this.settings.excludeFolders.find( + (excludedFolder) => (excludedFolder.path === folder) || + (excludedFolder.path === folder?.slice(0, folder?.lastIndexOf('/') >= 0 ? folder?.lastIndexOf('/') : folder.length) && excludedFolder.subFolders)); - if (excludedFolder?.disableFolderNote) { - event.target.onclick = null; - event.target.click(); - event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') - .forEach((element: HTMLElement) => { - if (element.innerText === (event.target as HTMLElement)?.innerText && element.classList.contains('is-folder-note')) { - element.removeClass('is-folder-note'); - } - }); - return; - } else if (excludedFolder?.enableCollapsing || this.settings.enableCollapsing) { - event.target.onclick = null; - event.target.click(); - } - const path = folder + '/' + event.target.innerText + '.md'; + if (excludedFolder?.disableFolderNote) { + event.target.onclick = null; + event.target.click(); + event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') + .forEach((element: HTMLElement) => { + if (element.innerText === (event.target as HTMLElement)?.innerText && element.classList.contains('is-folder-note')) { + element.removeClass('is-folder-note'); + } + }); + return; + } else if (excludedFolder?.enableCollapsing || this.settings.enableCollapsing) { + event.target.onclick = null; + event.target.click(); + } + const path = folder + '/' + event.target.innerText + '.md'; - if (this.app.vault.getAbstractFileByPath(path)) { - this.openFolderNote(path); - if (!this.settings.hideFolderNote) return; - event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') - .forEach((element: HTMLElement) => { - if (element.innerText === (event.target as HTMLElement)?.innerText && !element.classList.contains('is-folder-note')) { + if (this.app.vault.getAbstractFileByPath(path)) { + this.openFolderNote(path); + if (!this.settings.hideFolderNote) return; + event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') + .forEach((element: HTMLElement) => { + if (element.innerText === (event.target as HTMLElement)?.innerText && !element.classList.contains('is-folder-note')) { - element.addClass('is-folder-note'); - } - }); + element.addClass('is-folder-note'); + } + }); - } else if (event.altKey || event.ctrlKey) { - if ((this.settings.altKey && event.altKey) || (this.settings.ctrlKey && event.ctrlKey)) { - this.createFolderNote(path, true, true); - if (!this.settings.hideFolderNote) return; - event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') - .forEach((element: HTMLElement) => { - if (element.innerText === (event.target as HTMLElement)?.innerText && !element.classList.contains('is-folder-note')) { - element.addClass('is-folder-note'); - } - }); - } else { - event.target.onclick = null; - event.target.click(); - } - } else { - event.target.onclick = null; - event.target.click(); - } - } + } else if (event.altKey || event.ctrlKey) { + if ((this.settings.altKey && event.altKey) || (this.settings.ctrlKey && event.ctrlKey)) { + this.createFolderNote(path, true, true); + if (!this.settings.hideFolderNote) return; + event.target.parentElement?.parentElement?.getElementsByClassName('nav-folder-children').item(0)?.querySelectorAll('div.nav-file') + .forEach((element: HTMLElement) => { + if (element.innerText === (event.target as HTMLElement)?.innerText && !element.classList.contains('is-folder-note')) { + element.addClass('is-folder-note'); + } + }); + } else { + event.target.onclick = null; + event.target.click(); + } + } else { + event.target.onclick = null; + event.target.click(); + } + } - async createFolderNote(path: string, openFile: boolean, useModal?: boolean) { - const leaf = this.app.workspace.getLeaf(false); - const file = await this.app.vault.create(path, ''); - if (openFile) { - await leaf.openFile(file); - } - if (file) { - applyTemplate(this, file, this.settings.templatePath); - } - if (!this.settings.autoCreate) return; - if (!useModal) return; - const folder = this.app.vault.getAbstractFileByPath(path.substring(0, path.lastIndexOf('/' || '\\'))); - if (!(folder instanceof TFolder)) return; - const modal = new FolderNameModal(this.app, this, folder); - modal.open(); - } + async createFolderNote(path: string, openFile: boolean, useModal?: boolean) { + const leaf = this.app.workspace.getLeaf(false); + const file = await this.app.vault.create(path, ''); + if (openFile) { + await leaf.openFile(file); + } + if (file) { + applyTemplate(this, file, this.settings.templatePath); + } + if (!this.settings.autoCreate) return; + if (!useModal) return; + const folder = this.app.vault.getAbstractFileByPath(path.substring(0, path.lastIndexOf('/' || '\\'))); + if (!(folder instanceof TFolder)) return; + const modal = new FolderNameModal(this.app, this, folder); + modal.open(); + } - async openFolderNote(path: string) { - const leaf = this.app.workspace.getLeaf(false); - const file = this.app.vault.getAbstractFileByPath(path); - if (file instanceof TFile) { - await leaf.openFile(file); - } - } + async openFolderNote(path: string) { + const leaf = this.app.workspace.getLeaf(false); + const file = this.app.vault.getAbstractFileByPath(path); + if (file instanceof TFile) { + await leaf.openFile(file); + } + } - onunload() { - console.log('unloading folder notes plugin'); - this.observer.disconnect(); - document.body.classList.remove('folder-notes-plugin'); - } + onunload() { + console.log('unloading folder notes plugin'); + this.observer.disconnect(); + document.body.classList.remove('folder-notes-plugin'); + } - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } - async saveSettings() { - await this.saveData(this.settings); - } + async saveSettings() { + await this.saveData(this.settings); + } } diff --git a/src/modals/confirmCreation.ts b/src/modals/confirmCreation.ts index e7a659c..00808ca 100644 --- a/src/modals/confirmCreation.ts +++ b/src/modals/confirmCreation.ts @@ -1,47 +1,47 @@ import { App, Modal, Setting, TFolder } from 'obsidian'; import FolderNotesPlugin from '../main'; export default class ConfirmationModal extends Modal { - plugin: FolderNotesPlugin; - app: App; - folder: TFolder; - constructor(app: App, plugin: FolderNotesPlugin) { - super(app); - this.plugin = plugin; - this.app = app; - } - onOpen() { - const { contentEl } = this; - contentEl.createEl('h2', { text: 'Create folder note for every folder' }); - const setting = new Setting(contentEl) - setting.infoEl.createEl('p', { text: 'Make sure to backup your vault before using this feature.' }).style.color = '#fb464c'; - setting.infoEl.createEl('p', { text: 'This feature will create a folder note for every folder in your vault.' }); - setting.infoEl.createEl('p', { text: 'Every folder that already has a folder note will be ignored.' }); - setting.infoEl.createEl('p', { text: 'Every excluded folder will be ignored.' }); - setting.infoEl.parentElement?.classList.add('fn-confirmation-modal') - const button = setting.infoEl.createEl('button', { text: 'Create' }); - button.classList.add('mod-warning', 'fn-confirmation-modal-button'); - button.addEventListener('click', async () => { - this.close(); - this.app.vault.getAllLoadedFiles().forEach(async (folder) => { - if (folder instanceof TFolder) { - const excludedFolder = this.plugin.settings.excludeFolders.find( - (excludedFolder) => (excludedFolder.path === folder.path) || - (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf("/") >= 0 ? folder.path?.lastIndexOf("/") : folder.path.length) + plugin: FolderNotesPlugin; + app: App; + folder: TFolder; + constructor(app: App, plugin: FolderNotesPlugin) { + super(app); + this.plugin = plugin; + this.app = app; + } + onOpen() { + const { contentEl } = this; + contentEl.createEl('h2', { text: 'Create folder note for every folder' }); + const setting = new Setting(contentEl); + setting.infoEl.createEl('p', { text: 'Make sure to backup your vault before using this feature.' }).style.color = '#fb464c'; + setting.infoEl.createEl('p', { text: 'This feature will create a folder note for every folder in your vault.' }); + setting.infoEl.createEl('p', { text: 'Every folder that already has a folder note will be ignored.' }); + setting.infoEl.createEl('p', { text: 'Every excluded folder will be ignored.' }); + setting.infoEl.parentElement?.classList.add('fn-confirmation-modal'); + const button = setting.infoEl.createEl('button', { text: 'Create' }); + button.classList.add('mod-warning', 'fn-confirmation-modal-button'); + button.addEventListener('click', async () => { + this.close(); + this.app.vault.getAllLoadedFiles().forEach(async (folder) => { + if (folder instanceof TFolder) { + const excludedFolder = this.plugin.settings.excludeFolders.find( + (excludedFolder) => (excludedFolder.path === folder.path) || + (excludedFolder.path === folder.path?.slice(0, folder?.path.lastIndexOf('/') >= 0 ? folder.path?.lastIndexOf('/') : folder.path.length) && excludedFolder.subFolders)); - if (excludedFolder) return; - if (this.app.vault.getAbstractFileByPath(folder.path + '/' + folder.name + '.md')) return; - await this.plugin.createFolderNote(folder.path + '/' + folder.name + '.md', true); - } - }) - }); - button.focus(); - const cancelButton = setting.infoEl.createEl('button', { text: 'Cancel' }); - cancelButton.addEventListener('click', async () => { - this.close(); - }); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} \ No newline at end of file + if (excludedFolder) return; + if (this.app.vault.getAbstractFileByPath(folder.path + '/' + folder.name + '.md')) return; + await this.plugin.createFolderNote(folder.path + '/' + folder.name + '.md', true); + } + }); + }); + button.focus(); + const cancelButton = setting.infoEl.createEl('button', { text: 'Cancel' }); + cancelButton.addEventListener('click', async () => { + this.close(); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/modals/exludeFolderSettings.ts b/src/modals/exludeFolderSettings.ts index 47df07c..97be2e0 100644 --- a/src/modals/exludeFolderSettings.ts +++ b/src/modals/exludeFolderSettings.ts @@ -2,89 +2,89 @@ import { App, Modal, Setting } from 'obsidian'; import FolderNotesPlugin from '../main'; import { ExcludedFolder } from '../settings'; export default class ExcludedFolderSettings extends Modal { - plugin: FolderNotesPlugin; - app: App; - excludedFolder: ExcludedFolder; - constructor(app: App, plugin: FolderNotesPlugin, excludedFolder: ExcludedFolder) { - super(app); - this.plugin = plugin; - this.app = app; - this.excludedFolder = excludedFolder; - } - onOpen() { - this.display(); - } - display() { - const { contentEl } = this; - contentEl.empty(); - contentEl.createEl('h2', { text: 'Exluded folder settings' }); - new Setting(contentEl) - .setName('Include subfolders') - .setDesc('Choose if the subfolders of the folder should also be excluded') - .addToggle((toggle) => - toggle - .setValue(this.excludedFolder.subFolders) - .onChange(async (value) => { - this.excludedFolder.subFolders = value; - await this.plugin.saveSettings(); - }) - ); + plugin: FolderNotesPlugin; + app: App; + excludedFolder: ExcludedFolder; + constructor(app: App, plugin: FolderNotesPlugin, excludedFolder: ExcludedFolder) { + super(app); + this.plugin = plugin; + this.app = app; + this.excludedFolder = excludedFolder; + } + onOpen() { + this.display(); + } + display() { + const { contentEl } = this; + contentEl.empty(); + contentEl.createEl('h2', { text: 'Exluded folder settings' }); + new Setting(contentEl) + .setName('Include subfolders') + .setDesc('Choose if the subfolders of the folder should also be excluded') + .addToggle((toggle) => + toggle + .setValue(this.excludedFolder.subFolders) + .onChange(async (value) => { + this.excludedFolder.subFolders = value; + await this.plugin.saveSettings(); + }) + ); - new Setting(contentEl) - .setName('Disable folder name sync') - .setDesc('Choose if the folder note should be renamed when the folder name is changed') - .addToggle((toggle) => - toggle - .setValue(this.excludedFolder.disableSync) - .onChange(async (value) => { - this.excludedFolder.disableSync = value; - await this.plugin.saveSettings(); - }) - ); + new Setting(contentEl) + .setName('Disable folder name sync') + .setDesc('Choose if the folder note should be renamed when the folder name is changed') + .addToggle((toggle) => + toggle + .setValue(this.excludedFolder.disableSync) + .onChange(async (value) => { + this.excludedFolder.disableSync = value; + await this.plugin.saveSettings(); + }) + ); - new Setting(contentEl) - .setName('Disable auto creation of folder notes in this folder') - .setDesc('Choose if a folder note should be created when a new folder is created') - .addToggle((toggle) => - toggle - .setValue(this.excludedFolder.disableAutoCreate) - .onChange(async (value) => { - this.excludedFolder.disableAutoCreate = value; - await this.plugin.saveSettings(); - }) - ); + new Setting(contentEl) + .setName('Disable auto creation of folder notes in this folder') + .setDesc('Choose if a folder note should be created when a new folder is created') + .addToggle((toggle) => + toggle + .setValue(this.excludedFolder.disableAutoCreate) + .onChange(async (value) => { + this.excludedFolder.disableAutoCreate = value; + await this.plugin.saveSettings(); + }) + ); - new Setting(contentEl) - .setName('Disable open folder note') - .setDesc('Choose if the folder note should be opened when the folder is opened') - .addToggle((toggle) => - toggle - .setValue(this.excludedFolder.disableFolderNote) - .onChange(async (value) => { - this.excludedFolder.disableFolderNote = value; - await this.plugin.saveSettings(); - this.display(); - }) - ); + new Setting(contentEl) + .setName('Disable open folder note') + .setDesc('Choose if the folder note should be opened when the folder is opened') + .addToggle((toggle) => + toggle + .setValue(this.excludedFolder.disableFolderNote) + .onChange(async (value) => { + this.excludedFolder.disableFolderNote = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); - if (!this.excludedFolder.disableFolderNote) { - new Setting(contentEl) - .setName('Collapse folder when opening folder note') - .setDesc('Choose if the folder should be collapsed when the folder note is opened') - .addToggle((toggle) => - toggle - .setValue(this.excludedFolder.enableCollapsing) - .onChange(async (value) => { - this.excludedFolder.enableCollapsing = value; - await this.plugin.saveSettings(); - }) - ); - } + if (!this.excludedFolder.disableFolderNote) { + new Setting(contentEl) + .setName('Collapse folder when opening folder note') + .setDesc('Choose if the folder should be collapsed when the folder note is opened') + .addToggle((toggle) => + toggle + .setValue(this.excludedFolder.enableCollapsing) + .onChange(async (value) => { + this.excludedFolder.enableCollapsing = value; + await this.plugin.saveSettings(); + }) + ); + } - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} \ No newline at end of file + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/modals/folderName.ts b/src/modals/folderName.ts index 0660010..f308b73 100644 --- a/src/modals/folderName.ts +++ b/src/modals/folderName.ts @@ -1,41 +1,40 @@ import { App, Modal, Setting, TFolder } from 'obsidian'; import FolderNotesPlugin from '../main'; export default class FolderNameModal extends Modal { - plugin: FolderNotesPlugin; - app: App; - folder: TFolder; - constructor(app: App, plugin: FolderNotesPlugin, folder: TFolder) { - super(app); - this.plugin = plugin; - this.app = app; - this.folder = folder; - } - onOpen() { - const { contentEl } = this; - // close when user presses enter - contentEl.addEventListener('keydown', (e) => { - if (e.key === 'Enter') { - this.close(); - } - }); - contentEl.createEl('h2', { text: 'Folder name' }); - new Setting(contentEl) - .setName('Enter the name of the folder') - .addText((text) => - text - .setValue(this.folder.name.replace('.md', '')) - .onChange(async (value) => { - if (value.trim() !== "") { - if (!this.app.vault.getAbstractFileByPath(this.folder.path.slice(0, this.folder.path.lastIndexOf('/') + 1) + value.trim())) - { - this.app.vault.rename(this.folder, this.folder.path.slice(0, this.folder.path.lastIndexOf('/') + 1) + value.trim()); - } - } - }) - ); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} \ No newline at end of file + plugin: FolderNotesPlugin; + app: App; + folder: TFolder; + constructor(app: App, plugin: FolderNotesPlugin, folder: TFolder) { + super(app); + this.plugin = plugin; + this.app = app; + this.folder = folder; + } + onOpen() { + const { contentEl } = this; + // close when user presses enter + contentEl.addEventListener('keydown', (e) => { + if (e.key === 'Enter') { + this.close(); + } + }); + contentEl.createEl('h2', { text: 'Folder name' }); + new Setting(contentEl) + .setName('Enter the name of the folder') + .addText((text) => + text + .setValue(this.folder.name.replace('.md', '')) + .onChange(async (value) => { + if (value.trim() !== '') { + if (!this.app.vault.getAbstractFileByPath(this.folder.path.slice(0, this.folder.path.lastIndexOf('/') + 1) + value.trim())) { + this.app.vault.rename(this.folder, this.folder.path.slice(0, this.folder.path.lastIndexOf('/') + 1) + value.trim()); + } + } + }) + ); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/settings.ts b/src/settings.ts index 6f9c544..decf484 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,9 +1,9 @@ -import { App, PluginSettingTab, Setting } from "obsidian"; -import FolderNotesPlugin from "./main"; -import { FolderSuggest } from "./suggesters/folderSuggester"; -import ExcludedFolderSettings from "./modals/exludeFolderSettings"; -import { TemplateSuggest } from "./suggesters/templateSuggester"; -//import ConfirmationModal from "./modals/confirmCreation"; +import { App, PluginSettingTab, Setting } from 'obsidian'; +import FolderNotesPlugin from './main'; +import { FolderSuggest } from './suggesters/folderSuggester'; +import ExcludedFolderSettings from './modals/exludeFolderSettings'; +import { TemplateSuggest } from './suggesters/templateSuggester'; +// import ConfirmationModal from "./modals/confirmCreation"; export interface FolderNotesSettings { syncFolderName: boolean; ctrlKey: boolean; @@ -16,119 +16,119 @@ export interface FolderNotesSettings { } export const DEFAULT_SETTINGS: FolderNotesSettings = { - syncFolderName: true, - ctrlKey: true, - altKey: false, - hideFolderNote: false, - templatePath: '', - autoCreate: false, - enableCollapsing: false, - excludeFolders: [], + syncFolderName: true, + ctrlKey: true, + altKey: false, + hideFolderNote: false, + templatePath: '', + autoCreate: false, + enableCollapsing: false, + excludeFolders: [], }; export class SettingsTab extends PluginSettingTab { - plugin: FolderNotesPlugin; - app: App; - excludeFolders: ExcludedFolder[]; - constructor(app: App, plugin: FolderNotesPlugin) { - super(app, plugin); - } - display(): void { - const { containerEl } = this; + plugin: FolderNotesPlugin; + app: App; + excludeFolders: ExcludedFolder[]; + constructor(app: App, plugin: FolderNotesPlugin) { + super(app, plugin); + } + display(): void { + const { containerEl } = this; - containerEl.empty(); + containerEl.empty(); - containerEl.createEl('h2', { text: 'Folder notes settings' }); + containerEl.createEl('h2', { text: 'Folder notes settings' }); - new Setting(containerEl) - .setName('Disable folder collapsing') - .setDesc('Disable the ability to collapse folders by clicking on the folder name') - .addToggle((toggle) => - toggle - .setValue(!this.plugin.settings.enableCollapsing) - .onChange(async (value) => { - this.plugin.settings.enableCollapsing = !value; - await this.plugin.saveSettings(); - }) - ); + new Setting(containerEl) + .setName('Disable folder collapsing') + .setDesc('Disable the ability to collapse folders by clicking on the folder name') + .addToggle((toggle) => + toggle + .setValue(!this.plugin.settings.enableCollapsing) + .onChange(async (value) => { + this.plugin.settings.enableCollapsing = !value; + await this.plugin.saveSettings(); + }) + ); - new Setting(containerEl) - .setName('Hide folder note') - .setDesc('Hide the folder note in the file explorer') - .addToggle((toggle) => - toggle - .setValue(this.plugin.settings.hideFolderNote) - .onChange(async (value) => { - this.plugin.settings.hideFolderNote = value; - await this.plugin.saveSettings(); - if (value) { - document.body.classList.add('hide-folder-note'); - } else { - document.body.classList.remove('hide-folder-note'); - } - this.display(); - }) - ); - new Setting(containerEl) - .setName('Sync folder name') - .setDesc('Automatically rename the folder note when the folder name is changed') - .addToggle((toggle) => - toggle - .setValue(this.plugin.settings.syncFolderName) - .onChange(async (value) => { - this.plugin.settings.syncFolderName = value; - await this.plugin.saveSettings(); - this.display(); - }) - ); - new Setting(containerEl) - .setName('Auto create folder note') - .setDesc('Automatically create a folder note when a new folder is created') - .addToggle((toggle) => - toggle - .setValue(this.plugin.settings.autoCreate) - .onChange(async (value) => { - this.plugin.settings.autoCreate = value; - await this.plugin.saveSettings(); - this.display(); - }) - ); - new Setting(containerEl) - .setName('Key for creating folder note') - .setDesc('The key combination to create a folder note') - .addDropdown((dropdown) => { - dropdown - .addOption('ctrl', 'Ctrl + Click') - .addOption('alt', 'Alt + Click') - .setValue(this.plugin.settings.ctrlKey ? 'ctrl' : 'alt') - .onChange(async (value) => { - this.plugin.settings.ctrlKey = value === 'ctrl'; - this.plugin.settings.altKey = value === 'alt'; - await this.plugin.saveSettings(); - this.display(); - }); - }); + new Setting(containerEl) + .setName('Hide folder note') + .setDesc('Hide the folder note in the file explorer') + .addToggle((toggle) => + toggle + .setValue(this.plugin.settings.hideFolderNote) + .onChange(async (value) => { + this.plugin.settings.hideFolderNote = value; + await this.plugin.saveSettings(); + if (value) { + document.body.classList.add('hide-folder-note'); + } else { + document.body.classList.remove('hide-folder-note'); + } + this.display(); + }) + ); + new Setting(containerEl) + .setName('Sync folder name') + .setDesc('Automatically rename the folder note when the folder name is changed') + .addToggle((toggle) => + toggle + .setValue(this.plugin.settings.syncFolderName) + .onChange(async (value) => { + this.plugin.settings.syncFolderName = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + new Setting(containerEl) + .setName('Auto create folder note') + .setDesc('Automatically create a folder note when a new folder is created') + .addToggle((toggle) => + toggle + .setValue(this.plugin.settings.autoCreate) + .onChange(async (value) => { + this.plugin.settings.autoCreate = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + new Setting(containerEl) + .setName('Key for creating folder note') + .setDesc('The key combination to create a folder note') + .addDropdown((dropdown) => { + dropdown + .addOption('ctrl', 'Ctrl + Click') + .addOption('alt', 'Alt + Click') + .setValue(this.plugin.settings.ctrlKey ? 'ctrl' : 'alt') + .onChange(async (value) => { + this.plugin.settings.ctrlKey = value === 'ctrl'; + this.plugin.settings.altKey = value === 'alt'; + await this.plugin.saveSettings(); + this.display(); + }); + }); - new Setting(containerEl) - .setName('Template path') - .setDesc('The path to the template file') - .addSearch((cb) => { - new TemplateSuggest(cb.inputEl, this.plugin); - cb.setPlaceholder('Template path'); - cb.setValue(this.plugin.app.vault.getAbstractFileByPath(this.plugin.settings.templatePath)?.name.replace('.md', '') || ''); - cb.onChange(async (value) => { - if (value.trim() === '') { - this.plugin.settings.templatePath = ''; - await this.plugin.saveSettings(); - this.display(); - return; - } - }); - }); + new Setting(containerEl) + .setName('Template path') + .setDesc('The path to the template file') + .addSearch((cb) => { + new TemplateSuggest(cb.inputEl, this.plugin); + cb.setPlaceholder('Template path'); + cb.setValue(this.plugin.app.vault.getAbstractFileByPath(this.plugin.settings.templatePath)?.name.replace('.md', '') || ''); + cb.onChange(async (value) => { + if (value.trim() === '') { + this.plugin.settings.templatePath = ''; + await this.plugin.saveSettings(); + this.display(); + return; + } + }); + }); - // Due to issue with templater it'll be disabled for now - // If you want to try it yourself make a pr - // The issue was that it only used the first folder for all of the other folder notes - /* + // Due to issue with templater it'll be disabled for now + // If you want to try it yourself make a pr + // The issue was that it only used the first folder for all of the other folder notes + /* new Setting(containerEl) .setName('Create folder note for every folder') .setDesc('Create a folder note for every folder in the vault') @@ -143,122 +143,122 @@ export class SettingsTab extends PluginSettingTab { */ - new Setting(containerEl) - .setHeading() - .setName('Manage excluded folders') - new Setting(containerEl) - .setName('Add excluded folder') - .addButton(cb => { - cb.setIcon('plus'); - cb.setClass('add-exclude-folder'); - cb.setTooltip('Add excluded folder'); - cb.onClick(() => { - const excludedFolder = new ExcludedFolder('', this.plugin.settings.excludeFolders.length); - this.addExcludeFolderListItem(containerEl, excludedFolder); - this.addExcludedFolder(excludedFolder); - this.display(); - }) - }) - this.plugin.settings.excludeFolders.sort((a, b) => a.position - b.position).forEach((excludedFolder) => { - this.addExcludeFolderListItem(containerEl, excludedFolder); - }) - } - addExcludeFolderListItem(containerEl: HTMLElement, excludedFolder: ExcludedFolder) { - const setting = new Setting(containerEl) - setting.setClass('fn-exclude-folder-list-item') - setting.addSearch(cb => { - new FolderSuggest( - cb.inputEl, - this.plugin - ); - // @ts-ignore - cb.containerEl.addClass('fn-exclude-folder-path'); - cb.setPlaceholder('Folder path'); - cb.setValue(excludedFolder.path); - cb.onChange((value) => { - if (!this.app.vault.getAbstractFileByPath(value)) return; - excludedFolder.path = value; - this.updateExcludedFolder(excludedFolder, excludedFolder); - }) - }) - setting.addButton(cb => { - cb.setIcon('edit'); - cb.setTooltip('Edit folder note'); - cb.onClick(() => { - new ExcludedFolderSettings(this.app, this.plugin, excludedFolder).open(); - }) - }) + new Setting(containerEl) + .setHeading() + .setName('Manage excluded folders'); + new Setting(containerEl) + .setName('Add excluded folder') + .addButton((cb) => { + cb.setIcon('plus'); + cb.setClass('add-exclude-folder'); + cb.setTooltip('Add excluded folder'); + cb.onClick(() => { + const excludedFolder = new ExcludedFolder('', this.plugin.settings.excludeFolders.length); + this.addExcludeFolderListItem(containerEl, excludedFolder); + this.addExcludedFolder(excludedFolder); + this.display(); + }); + }); + this.plugin.settings.excludeFolders.sort((a, b) => a.position - b.position).forEach((excludedFolder) => { + this.addExcludeFolderListItem(containerEl, excludedFolder); + }); + } + addExcludeFolderListItem(containerEl: HTMLElement, excludedFolder: ExcludedFolder) { + const setting = new Setting(containerEl); + setting.setClass('fn-exclude-folder-list-item'); + setting.addSearch((cb) => { + new FolderSuggest( + cb.inputEl, + this.plugin + ); + // @ts-ignore + cb.containerEl.addClass('fn-exclude-folder-path'); + cb.setPlaceholder('Folder path'); + cb.setValue(excludedFolder.path); + cb.onChange((value) => { + if (!this.app.vault.getAbstractFileByPath(value)) return; + excludedFolder.path = value; + this.updateExcludedFolder(excludedFolder, excludedFolder); + }); + }); + setting.addButton((cb) => { + cb.setIcon('edit'); + cb.setTooltip('Edit folder note'); + cb.onClick(() => { + new ExcludedFolderSettings(this.app, this.plugin, excludedFolder).open(); + }); + }); - setting.addButton(cb => { - cb.setIcon('up-chevron-glyph'); - cb.setTooltip('Move up'); - cb.onClick(() => { - if (excludedFolder.position === 0) return; - excludedFolder.position = excludedFolder.position - 1; - this.updateExcludedFolder(excludedFolder, excludedFolder); - const oldExcludedFolder = this.plugin.settings.excludeFolders.find(folder => folder.position == excludedFolder.position) - if (oldExcludedFolder) { + setting.addButton((cb) => { + cb.setIcon('up-chevron-glyph'); + cb.setTooltip('Move up'); + cb.onClick(() => { + if (excludedFolder.position === 0) return; + excludedFolder.position -= 1; + this.updateExcludedFolder(excludedFolder, excludedFolder); + const oldExcludedFolder = this.plugin.settings.excludeFolders.find((folder) => folder.position === excludedFolder.position); + if (oldExcludedFolder) { - oldExcludedFolder.position = oldExcludedFolder.position + 1; - this.updateExcludedFolder(oldExcludedFolder, oldExcludedFolder); - } - this.display(); - }) - }) - setting.addButton(cb => { - cb.setIcon('down-chevron-glyph'); - cb.setTooltip('Move down'); - cb.onClick(() => { - if (excludedFolder.position === this.plugin.settings.excludeFolders.length - 1) return; - excludedFolder.position = excludedFolder.position + 1; - this.updateExcludedFolder(excludedFolder, excludedFolder); - const oldExcludedFolder = this.plugin.settings.excludeFolders.find(folder => folder.position == excludedFolder.position) - if (oldExcludedFolder) { - oldExcludedFolder.position = oldExcludedFolder.position - 1; - this.updateExcludedFolder(oldExcludedFolder, oldExcludedFolder); - } - this.display(); - }) - }) - setting.addButton(cb => { - cb.setIcon('trash-2'); - cb.setTooltip('Delete excluded folder'); - cb.onClick(() => { - this.deleteExcludedFolder(excludedFolder); - setting.clear(); - setting.settingEl.remove(); - }) - }) - } - addExcludedFolder(excludedFolder: ExcludedFolder) { - this.plugin.settings.excludeFolders.push(excludedFolder); - this.plugin.saveSettings(); - } - deleteExcludedFolder(excludedFolder: ExcludedFolder) { - this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path); - this.plugin.saveSettings(); - } - updateExcludedFolder(excludedFolder: ExcludedFolder, newExcludeFolder: ExcludedFolder) { - this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path); - this.addExcludedFolder(newExcludeFolder); - } + oldExcludedFolder.position += 1; + this.updateExcludedFolder(oldExcludedFolder, oldExcludedFolder); + } + this.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon('down-chevron-glyph'); + cb.setTooltip('Move down'); + cb.onClick(() => { + if (excludedFolder.position === this.plugin.settings.excludeFolders.length - 1) return; + excludedFolder.position += 1; + this.updateExcludedFolder(excludedFolder, excludedFolder); + const oldExcludedFolder = this.plugin.settings.excludeFolders.find((folder) => folder.position === excludedFolder.position); + if (oldExcludedFolder) { + oldExcludedFolder.position -= 1; + this.updateExcludedFolder(oldExcludedFolder, oldExcludedFolder); + } + this.display(); + }); + }); + setting.addButton((cb) => { + cb.setIcon('trash-2'); + cb.setTooltip('Delete excluded folder'); + cb.onClick(() => { + this.deleteExcludedFolder(excludedFolder); + setting.clear(); + setting.settingEl.remove(); + }); + }); + } + addExcludedFolder(excludedFolder: ExcludedFolder) { + this.plugin.settings.excludeFolders.push(excludedFolder); + this.plugin.saveSettings(); + } + deleteExcludedFolder(excludedFolder: ExcludedFolder) { + this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path); + this.plugin.saveSettings(); + } + updateExcludedFolder(excludedFolder: ExcludedFolder, newExcludeFolder: ExcludedFolder) { + this.plugin.settings.excludeFolders = this.plugin.settings.excludeFolders.filter((folder) => folder.path !== excludedFolder.path); + this.addExcludedFolder(newExcludeFolder); + } } export class ExcludedFolder { - path: string; - subFolders: boolean; - disableSync: boolean; - disableAutoCreate: boolean; - disableFolderNote: boolean; - enableCollapsing: boolean; - position: number; - constructor(path: string, position: number) { - this.path = path; - this.subFolders = true; - this.disableSync = true; - this.disableAutoCreate = true; - this.disableFolderNote = false; - this.enableCollapsing = false; - this.position = position; - } -} \ No newline at end of file + path: string; + subFolders: boolean; + disableSync: boolean; + disableAutoCreate: boolean; + disableFolderNote: boolean; + enableCollapsing: boolean; + position: number; + constructor(path: string, position: number) { + this.path = path; + this.subFolders = true; + this.disableSync = true; + this.disableAutoCreate = true; + this.disableFolderNote = false; + this.enableCollapsing = false; + this.position = position; + } +} diff --git a/src/suggesters/FileSuggester.ts b/src/suggesters/FileSuggester.ts index c552642..8857bac 100644 --- a/src/suggesters/FileSuggester.ts +++ b/src/suggesters/FileSuggester.ts @@ -1,54 +1,54 @@ // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes and https://github.com/SilentVoid13/Templater -import { TAbstractFile, TFile } from "obsidian"; -import { TextInputSuggest } from "./suggest"; -import FolderNotesPlugin from "../main"; +import { TAbstractFile, TFile } from 'obsidian'; +import { TextInputSuggest } from './suggest'; +import FolderNotesPlugin from '../main'; export enum FileSuggestMode { TemplateFiles, ScriptFiles, } export class FileSuggest extends TextInputSuggest { - constructor( + constructor( public inputEl: HTMLInputElement, private plugin: FolderNotesPlugin - ) { - super(inputEl); - } + ) { + super(inputEl); + } - get_error_msg(mode: FileSuggestMode): string { - switch (mode) { - case FileSuggestMode.TemplateFiles: - return `Templates folder doesn't exist`; - case FileSuggestMode.ScriptFiles: - return `User Scripts folder doesn't exist`; - } - } + get_error_msg(mode: FileSuggestMode): string { + switch (mode) { + case FileSuggestMode.TemplateFiles: + return 'Templates folder doesn\'t exist'; + case FileSuggestMode.ScriptFiles: + return 'User Scripts folder doesn\'t exist'; + } + } - getSuggestions(input_str: string): TFile[] { - const files: TFile[] = []; - const lower_input_str = input_str.toLowerCase(); + getSuggestions(input_str: string): TFile[] { + const files: TFile[] = []; + const lower_input_str = input_str.toLowerCase(); - this.plugin.app.vault.getFiles().forEach((file: TAbstractFile) => { - if ( - file instanceof TFile && + this.plugin.app.vault.getFiles().forEach((file: TAbstractFile) => { + if ( + file instanceof TFile && file.path.toLowerCase().contains(lower_input_str) - ) { - files.push(file); - } - }); + ) { + files.push(file); + } + }); - return files; - } + return files; + } - renderSuggestion(file: TFile, el: HTMLElement): void { - el.setText(file.path); - } + renderSuggestion(file: TFile, el: HTMLElement): void { + el.setText(file.path); + } - selectSuggestion(file: TFile): void { - this.inputEl.value = file.path; - this.inputEl.trigger("input"); - this.close(); - } -} \ No newline at end of file + selectSuggestion(file: TFile): void { + this.inputEl.value = file.path; + this.inputEl.trigger('input'); + this.close(); + } +} diff --git a/src/suggesters/FolderSuggester.ts b/src/suggesters/FolderSuggester.ts index 7660b32..e0c3b6d 100644 --- a/src/suggesters/FolderSuggester.ts +++ b/src/suggesters/FolderSuggester.ts @@ -1,54 +1,54 @@ // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes and https://github.com/SilentVoid13/Templater -import { TAbstractFile, TFolder } from "obsidian"; -import { TextInputSuggest } from "./suggest"; -import FolderNotesPlugin from "../main"; +import { TAbstractFile, TFolder } from 'obsidian'; +import { TextInputSuggest } from './suggest'; +import FolderNotesPlugin from '../main'; export enum FileSuggestMode { TemplateFiles, ScriptFiles, } export class FolderSuggest extends TextInputSuggest { - constructor( + constructor( public inputEl: HTMLInputElement, private plugin: FolderNotesPlugin - ) { - super(inputEl); - } + ) { + super(inputEl); + } - get_error_msg(mode: FileSuggestMode): string { - switch (mode) { - case FileSuggestMode.TemplateFiles: - return `Templates folder doesn't exist`; - case FileSuggestMode.ScriptFiles: - return `User Scripts folder doesn't exist`; - } - } + get_error_msg(mode: FileSuggestMode): string { + switch (mode) { + case FileSuggestMode.TemplateFiles: + return 'Templates folder doesn\'t exist'; + case FileSuggestMode.ScriptFiles: + return 'User Scripts folder doesn\'t exist'; + } + } - getSuggestions(input_str: string): TFolder[] { - const folders: TFolder[] = []; - const lower_input_str = input_str.toLowerCase(); - this.plugin.app.vault.getAllLoadedFiles().forEach((folder: TAbstractFile) => { - if ( - folder instanceof TFolder && + getSuggestions(input_str: string): TFolder[] { + const folders: TFolder[] = []; + const lower_input_str = input_str.toLowerCase(); + this.plugin.app.vault.getAllLoadedFiles().forEach((folder: TAbstractFile) => { + if ( + folder instanceof TFolder && folder.path.toLowerCase().contains(lower_input_str) && - !this.plugin.settings.excludeFolders.find(f => f.path === folder.path) - ) { - folders.push(folder); - } - }); + !this.plugin.settings.excludeFolders.find((f) => f.path === folder.path) + ) { + folders.push(folder); + } + }); - return folders; - } + return folders; + } - renderSuggestion(folder: TFolder, el: HTMLElement): void { - el.setText(folder.path); - } + renderSuggestion(folder: TFolder, el: HTMLElement): void { + el.setText(folder.path); + } - selectSuggestion(folder: TFolder): void { - this.inputEl.value = folder.path; - this.inputEl.trigger("input"); - this.close(); - } -} \ No newline at end of file + selectSuggestion(folder: TFolder): void { + this.inputEl.value = folder.path; + this.inputEl.trigger('input'); + this.close(); + } +} diff --git a/src/suggesters/suggest.ts b/src/suggesters/suggest.ts index 5e03bc9..d116118 100644 --- a/src/suggesters/suggest.ts +++ b/src/suggesters/suggest.ts @@ -1,202 +1,202 @@ // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes and https://github.com/SilentVoid13/Templater -import { ISuggestOwner, Scope } from "obsidian"; -import { createPopper, Instance as PopperInstance } from "@popperjs/core"; +import { ISuggestOwner, Scope } from 'obsidian'; +import { createPopper, Instance as PopperInstance } from '@popperjs/core'; const wrapAround = (value: number, size: number): number => { - return ((value % size) + size) % size; + return ((value % size) + size) % size; }; class Suggest { - private owner: ISuggestOwner; - private values: T[]; - private suggestions: HTMLDivElement[]; - private selectedItem: number; - private containerEl: HTMLElement; + private owner: ISuggestOwner; + private values: T[]; + private suggestions: HTMLDivElement[]; + private selectedItem: number; + private containerEl: HTMLElement; - constructor( - owner: ISuggestOwner, - containerEl: HTMLElement, - scope: Scope - ) { - this.owner = owner; - this.containerEl = containerEl; + constructor( + owner: ISuggestOwner, + containerEl: HTMLElement, + scope: Scope + ) { + this.owner = owner; + this.containerEl = containerEl; - containerEl.on( - "click", - ".suggestion-item", - this.onSuggestionClick.bind(this) - ); - containerEl.on( - "mousemove", - ".suggestion-item", - this.onSuggestionMouseover.bind(this) - ); + containerEl.on( + 'click', + '.suggestion-item', + this.onSuggestionClick.bind(this) + ); + containerEl.on( + 'mousemove', + '.suggestion-item', + this.onSuggestionMouseover.bind(this) + ); - scope.register([], "ArrowUp", (event) => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem - 1, true); - return false; - } - }); + scope.register([], 'ArrowUp', (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem - 1, true); + return false; + } + }); - scope.register([], "ArrowDown", (event) => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem + 1, true); - return false; - } - }); + scope.register([], 'ArrowDown', (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem + 1, true); + return false; + } + }); - scope.register([], "Enter", (event) => { - if (!event.isComposing) { - this.useSelectedItem(event); - return false; - } - }); - } + scope.register([], 'Enter', (event) => { + if (!event.isComposing) { + this.useSelectedItem(event); + return false; + } + }); + } - onSuggestionClick(event: MouseEvent, el: HTMLDivElement): void { - event.preventDefault(); + onSuggestionClick(event: MouseEvent, el: HTMLDivElement): void { + event.preventDefault(); - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - this.useSelectedItem(event); - } + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + this.useSelectedItem(event); + } - onSuggestionMouseover(_event: MouseEvent, el: HTMLDivElement): void { - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - } + onSuggestionMouseover(_event: MouseEvent, el: HTMLDivElement): void { + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + } - setSuggestions(values: T[]) { - this.containerEl.empty(); - const suggestionEls: HTMLDivElement[] = []; + setSuggestions(values: T[]) { + this.containerEl.empty(); + const suggestionEls: HTMLDivElement[] = []; - values.forEach((value) => { - const suggestionEl = this.containerEl.createDiv("suggestion-item"); - this.owner.renderSuggestion(value, suggestionEl); - suggestionEls.push(suggestionEl); - }); + values.forEach((value) => { + const suggestionEl = this.containerEl.createDiv('suggestion-item'); + this.owner.renderSuggestion(value, suggestionEl); + suggestionEls.push(suggestionEl); + }); - this.values = values; - this.suggestions = suggestionEls; - this.setSelectedItem(0, false); - } + this.values = values; + this.suggestions = suggestionEls; + this.setSelectedItem(0, false); + } - useSelectedItem(event: MouseEvent | KeyboardEvent) { - const currentValue = this.values[this.selectedItem]; - if (currentValue) { - this.owner.selectSuggestion(currentValue, event); - } - } + useSelectedItem(event: MouseEvent | KeyboardEvent) { + const currentValue = this.values[this.selectedItem]; + if (currentValue) { + this.owner.selectSuggestion(currentValue, event); + } + } - setSelectedItem(selectedIndex: number, scrollIntoView: boolean) { - const normalizedIndex = wrapAround( - selectedIndex, - this.suggestions.length - ); - const prevSelectedSuggestion = this.suggestions[this.selectedItem]; - const selectedSuggestion = this.suggestions[normalizedIndex]; + setSelectedItem(selectedIndex: number, scrollIntoView: boolean) { + const normalizedIndex = wrapAround( + selectedIndex, + this.suggestions.length + ); + const prevSelectedSuggestion = this.suggestions[this.selectedItem]; + const selectedSuggestion = this.suggestions[normalizedIndex]; - prevSelectedSuggestion?.removeClass("is-selected"); - selectedSuggestion?.addClass("is-selected"); + prevSelectedSuggestion?.removeClass('is-selected'); + selectedSuggestion?.addClass('is-selected'); - this.selectedItem = normalizedIndex; + this.selectedItem = normalizedIndex; - if (scrollIntoView) { - selectedSuggestion.scrollIntoView(false); - } - } + if (scrollIntoView) { + selectedSuggestion.scrollIntoView(false); + } + } } export abstract class TextInputSuggest implements ISuggestOwner { - protected inputEl: HTMLInputElement | HTMLTextAreaElement; + protected inputEl: HTMLInputElement | HTMLTextAreaElement; - private popper: PopperInstance; - private scope: Scope; - private suggestEl: HTMLElement; - private suggest: Suggest; + private popper: PopperInstance; + private scope: Scope; + private suggestEl: HTMLElement; + private suggest: Suggest; - constructor(inputEl: HTMLInputElement | HTMLTextAreaElement) { - this.inputEl = inputEl; - this.scope = new Scope(); + constructor(inputEl: HTMLInputElement | HTMLTextAreaElement) { + this.inputEl = inputEl; + this.scope = new Scope(); - this.suggestEl = createDiv("suggestion-container"); - const suggestion = this.suggestEl.createDiv("suggestion"); - this.suggest = new Suggest(this, suggestion, this.scope); + this.suggestEl = createDiv('suggestion-container'); + const suggestion = this.suggestEl.createDiv('suggestion'); + this.suggest = new Suggest(this, suggestion, this.scope); - this.scope.register([], "Escape", this.close.bind(this)); + this.scope.register([], 'Escape', this.close.bind(this)); - this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); - this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); - this.inputEl.addEventListener("blur", this.close.bind(this)); - this.suggestEl.on( - "mousedown", - ".suggestion-container", - (event: MouseEvent) => { - event.preventDefault(); - } - ); - } + this.inputEl.addEventListener('input', this.onInputChanged.bind(this)); + this.inputEl.addEventListener('focus', this.onInputChanged.bind(this)); + this.inputEl.addEventListener('blur', this.close.bind(this)); + this.suggestEl.on( + 'mousedown', + '.suggestion-container', + (event: MouseEvent) => { + event.preventDefault(); + } + ); + } - onInputChanged(): void { - const inputStr = this.inputEl.value; - const suggestions = this.getSuggestions(inputStr); + onInputChanged(): void { + const inputStr = this.inputEl.value; + const suggestions = this.getSuggestions(inputStr); - if (!suggestions) { - this.close(); - return; - } + if (!suggestions) { + this.close(); + return; + } - if (suggestions.length > 0) { - this.suggest.setSuggestions(suggestions); - // @ts-ignore - this.open(app.dom.appContainerEl, this.inputEl); - } else { - this.close(); - } - } + if (suggestions.length > 0) { + this.suggest.setSuggestions(suggestions); + // @ts-ignore + this.open(app.dom.appContainerEl, this.inputEl); + } else { + this.close(); + } + } - open(container: HTMLElement, inputEl: HTMLElement): void { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - app.keymap.pushScope(this.scope); + open(container: HTMLElement, inputEl: HTMLElement): void { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + app.keymap.pushScope(this.scope); - container.appendChild(this.suggestEl); - this.popper = createPopper(inputEl, this.suggestEl, { - placement: "bottom-start", - modifiers: [ - { - name: "sameWidth", - enabled: true, - fn: ({ state, instance }) => { - // Note: positioning needs to be calculated twice - - // first pass - positioning it according to the width of the popper - // second pass - position it with the width bound to the reference element - // we need to early exit to avoid an infinite loop - const targetWidth = `${state.rects.reference.width}px`; - if (state.styles.popper.width === targetWidth) { - return; - } - state.styles.popper.width = targetWidth; - instance.update(); - }, - phase: "beforeWrite", - requires: ["computeStyles"], - }, - ], - }); - } + container.appendChild(this.suggestEl); + this.popper = createPopper(inputEl, this.suggestEl, { + placement: 'bottom-start', + modifiers: [ + { + name: 'sameWidth', + enabled: true, + fn: ({ state, instance }) => { + // Note: positioning needs to be calculated twice - + // first pass - positioning it according to the width of the popper + // second pass - position it with the width bound to the reference element + // we need to early exit to avoid an infinite loop + const targetWidth = `${state.rects.reference.width}px`; + if (state.styles.popper.width === targetWidth) { + return; + } + state.styles.popper.width = targetWidth; + instance.update(); + }, + phase: 'beforeWrite', + requires: ['computeStyles'], + }, + ], + }); + } - close(): void { - app.keymap.popScope(this.scope); + close(): void { + app.keymap.popScope(this.scope); - this.suggest.setSuggestions([]); - if (this.popper) this.popper.destroy(); - this.suggestEl.detach(); - } + this.suggest.setSuggestions([]); + if (this.popper) this.popper.destroy(); + this.suggestEl.detach(); + } abstract getSuggestions(inputStr: string): T[]; abstract renderSuggestion(item: T, el: HTMLElement): void; abstract selectSuggestion(item: T): void; -} \ No newline at end of file +} diff --git a/src/suggesters/templateSuggester.ts b/src/suggesters/templateSuggester.ts index e39a9f7..92864e0 100644 --- a/src/suggesters/templateSuggester.ts +++ b/src/suggesters/templateSuggester.ts @@ -1,70 +1,70 @@ // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes and https://github.com/SilentVoid13/Templater -import { TAbstractFile, TFile, TFolder, Vault } from "obsidian"; -import { TextInputSuggest } from "./suggest"; -import FolderNotesPlugin from "../main"; -import { getTemplatePlugins } from "src/template"; +import { TAbstractFile, TFile, TFolder, Vault } from 'obsidian'; +import { TextInputSuggest } from './suggest'; +import FolderNotesPlugin from '../main'; +import { getTemplatePlugins } from 'src/template'; export enum FileSuggestMode { TemplateFiles, ScriptFiles, } export class TemplateSuggest extends TextInputSuggest { - constructor( + constructor( public inputEl: HTMLInputElement, private plugin: FolderNotesPlugin - ) { - super(inputEl); - } + ) { + super(inputEl); + } - get_error_msg(mode: FileSuggestMode): string { - switch (mode) { - case FileSuggestMode.TemplateFiles: - return `Templates folder doesn't exist`; - case FileSuggestMode.ScriptFiles: - return `User Scripts folder doesn't exist`; - } - } + get_error_msg(mode: FileSuggestMode): string { + switch (mode) { + case FileSuggestMode.TemplateFiles: + return 'Templates folder doesn\'t exist'; + case FileSuggestMode.ScriptFiles: + return 'User Scripts folder doesn\'t exist'; + } + } - getSuggestions(input_str: string): TFile[] { - const { templateFolder, templaterPlugin } = getTemplatePlugins(this.plugin.app); - if ((!templateFolder || templateFolder?.trim() === "") && !templaterPlugin) { - this.plugin.settings.templatePath = ""; - this.plugin.saveSettings(); - return []; - } - let folder: TFolder; - if (templaterPlugin) { - folder = this.plugin.app.vault.getAbstractFileByPath(templaterPlugin.plugin?.settings?.templates_folder as string) as TFolder; - - } else { - folder = this.plugin.app.vault.getAbstractFileByPath(templateFolder) as TFolder; - } + getSuggestions(input_str: string): TFile[] { + const { templateFolder, templaterPlugin } = getTemplatePlugins(this.plugin.app); + if ((!templateFolder || templateFolder?.trim() === '') && !templaterPlugin) { + this.plugin.settings.templatePath = ''; + this.plugin.saveSettings(); + return []; + } + let folder: TFolder; + if (templaterPlugin) { + folder = this.plugin.app.vault.getAbstractFileByPath(templaterPlugin.plugin?.settings?.templates_folder as string) as TFolder; - const files: TFile[] = []; - const lower_input_str = input_str.toLowerCase(); + } else { + folder = this.plugin.app.vault.getAbstractFileByPath(templateFolder) as TFolder; + } - Vault.recurseChildren(folder, (file: TAbstractFile) => { - if (file instanceof TFile && + const files: TFile[] = []; + const lower_input_str = input_str.toLowerCase(); + + Vault.recurseChildren(folder, (file: TAbstractFile) => { + if (file instanceof TFile && file.path.toLowerCase().contains(lower_input_str) - ) { - files.push(file); - } - }); + ) { + files.push(file); + } + }); - return files; - } + return files; + } - renderSuggestion(file: TFile, el: HTMLElement): void { - el.setText(file.name.replace(".md", "")); - } + renderSuggestion(file: TFile, el: HTMLElement): void { + el.setText(file.name.replace('.md', '')); + } - selectSuggestion(file: TFile): void { - this.inputEl.value = file.name.replace(".md", ""); - this.inputEl.trigger("input"); - this.plugin.settings.templatePath = file.path; - this.plugin.saveSettings(); - this.close(); - } -} \ No newline at end of file + selectSuggestion(file: TFile): void { + this.inputEl.value = file.name.replace('.md', ''); + this.inputEl.trigger('input'); + this.plugin.settings.templatePath = file.path; + this.plugin.saveSettings(); + this.close(); + } +} diff --git a/src/template.ts b/src/template.ts index 36a968b..04f2938 100644 --- a/src/template.ts +++ b/src/template.ts @@ -5,78 +5,78 @@ import { TFile, App } from 'obsidian'; import FolderNotesPlugin from './main'; export async function applyTemplate( - plugin: FolderNotesPlugin, - file: TFile, - templatePath?: string + plugin: FolderNotesPlugin, + file: TFile, + templatePath?: string ) { - const templateFile = templatePath - ? plugin.app.vault.getAbstractFileByPath(templatePath) - : null; + const templateFile = templatePath + ? plugin.app.vault.getAbstractFileByPath(templatePath) + : null; - if (templateFile && templateFile instanceof TFile) { - try { + if (templateFile && templateFile instanceof TFile) { + try { - const { - templatesEnabled, - templaterEnabled, - templatesPlugin, - templaterPlugin, - } = getTemplatePlugins(plugin.app); - const templateContent = await plugin.app.vault.read(templateFile); + const { + templatesEnabled, + templaterEnabled, + templatesPlugin, + templaterPlugin, + } = getTemplatePlugins(plugin.app); + const templateContent = await plugin.app.vault.read(templateFile); - // If both plugins are enabled, attempt to detect templater first + // If both plugins are enabled, attempt to detect templater first - if (templatesEnabled && templaterEnabled) { - if (/<%/.test(templateContent)) { - return await templaterPlugin.write_template_to_file( - templateFile, - file - ); - } - return await templatesPlugin.instance.insertTemplate(templateFile); - } + if (templatesEnabled && templaterEnabled) { + if (/<%/.test(templateContent)) { + return await templaterPlugin.write_template_to_file( + templateFile, + file + ); + } + return await templatesPlugin.instance.insertTemplate(templateFile); + } - if (templatesEnabled) { - return await templatesPlugin.instance.insertTemplate(templateFile); - } + if (templatesEnabled) { + return await templatesPlugin.instance.insertTemplate(templateFile); + } - if (templaterEnabled) { - return await templaterPlugin.write_template_to_file( - templateFile, - file - ); - } + if (templaterEnabled) { + return await templaterPlugin.write_template_to_file( + templateFile, + file + ); + } - } catch (e) { - console.error(e); - } - } + } catch (e) { + console.error(e); + } + } } export function getTemplatePlugins(app: App) { - const templatesPlugin = (app as any).internalPlugins.plugins.templates; - const templatesEnabled = templatesPlugin.enabled; - const templaterPlugin = (app as any).plugins.plugins['templater-obsidian']; - const templaterEnabled = (app as any).plugins.enabledPlugins.has( - 'templater-obsidian' - ); - const templaterEmptyFileTemplate = - templaterPlugin && - (this.app as any).plugins.plugins['templater-obsidian'].settings - ?.empty_file_template; + const templatesPlugin = (app as any).internalPlugins.plugins.templates; + const templatesEnabled = templatesPlugin.enabled; + const templaterPlugin = (app as any).plugins.plugins['templater-obsidian']; + const templaterEnabled = (app as any).plugins.enabledPlugins.has( + 'templater-obsidian' + ); + const templaterEmptyFileTemplate = + templaterPlugin && + (this.app as any).plugins.plugins['templater-obsidian'].settings + ?.empty_file_template; - const templateFolder = templatesEnabled - ? templatesPlugin.instance.options.folder - : templaterPlugin - ? templaterPlugin.settings.template_folder - : undefined; + const templateFolder = templatesEnabled + ? templatesPlugin.instance.options.folder + : templaterPlugin + ? templaterPlugin.settings.template_folder + : undefined; - return { - templatesPlugin, - templatesEnabled, - templaterPlugin: templaterPlugin?.templater, - templaterEnabled, - templaterEmptyFileTemplate, - templateFolder, - }; -} \ No newline at end of file + return { + templatesPlugin, + templatesEnabled, + templaterPlugin: templaterPlugin?.templater, + templaterEnabled, + templaterEmptyFileTemplate, + templateFolder, + }; +}