From 7e26d0e246b0205db400063758e9cc1cedafbd27 Mon Sep 17 00:00:00 2001 From: Lost Paul <70213368+LostPaul@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:37:26 +0200 Subject: [PATCH] Option to delete folder note permanently, move to trash, ... Now you can choose if you want to delete the folder note permanently or just want to move it the system/obsidian trash like it's possible for normal files This also fixes #142 & #120 --- src/Commands.ts | 4 +- src/events/handleDelete.ts | 4 +- src/functions/folderNoteFunctions.ts | 17 ++++-- src/modals/DeleteConfirmation.ts | 81 ++++++++++++++-------------- src/settings/GeneralSettings.ts | 29 ++++++++++ src/settings/SettingsTab.ts | 2 + 6 files changed, 90 insertions(+), 47 deletions(-) diff --git a/src/Commands.ts b/src/Commands.ts index 99c9103..30c03be 100644 --- a/src/Commands.ts +++ b/src/Commands.ts @@ -90,7 +90,7 @@ export class Commands { if (!(folder instanceof TFolder)) return; const folderNote = getFolderNote(this.plugin, folder.path); if (!(folderNote instanceof TFile)) return; - deleteFolderNote(this.plugin, folderNote); + deleteFolderNote(this.plugin, folderNote, true); } }); this.plugin.addCommand({ @@ -298,7 +298,7 @@ export class Commands { item.setTitle('Delete folder note') .setIcon('trash') .onClick(() => { - deleteFolderNote(this.plugin, folderNote); + deleteFolderNote(this.plugin, folderNote, true); }); }); diff --git a/src/events/handleDelete.ts b/src/events/handleDelete.ts index 60f1b9a..5c28de9 100644 --- a/src/events/handleDelete.ts +++ b/src/events/handleDelete.ts @@ -1,6 +1,6 @@ import { TAbstractFile, TFolder, TFile } from 'obsidian'; import FolderNotesPlugin from 'src/main'; -import { getFolderNote, getFolder } from 'src/functions/folderNoteFunctions'; +import { getFolderNote, getFolder, deleteFolderNote } from 'src/functions/folderNoteFunctions'; import { removeCSSClassFromEL, addCSSClassToTitleEL } from 'src/functions/styleFunctions'; import { getFolderPathFromString } from 'src/functions/utils'; @@ -28,5 +28,5 @@ export function handleDelete(file: TAbstractFile, plugin: FolderNotesPlugin) { if (!folderNote) { return; } removeCSSClassFromEL(folderNote.path, 'is-folder-note'); if (!plugin.settings.syncDelete) { return; } - plugin.app.vault.delete(folderNote); + deleteFolderNote(plugin, folderNote, false); } \ No newline at end of file diff --git a/src/functions/folderNoteFunctions.ts b/src/functions/folderNoteFunctions.ts index becf903..1fa9ff1 100644 --- a/src/functions/folderNoteFunctions.ts +++ b/src/functions/folderNoteFunctions.ts @@ -179,14 +179,25 @@ export async function openFolderNote(plugin: FolderNotesPlugin, file: TAbstractF } } -export async function deleteFolderNote(plugin: FolderNotesPlugin, file: TFile) { - if (plugin.settings.showDeleteConfirmation) { +export async function deleteFolderNote(plugin: FolderNotesPlugin, file: TFile, displayModal: boolean) { + if (plugin.settings.showDeleteConfirmation && displayModal) { return new DeleteConfirmationModal(plugin.app, plugin, file).open(); } const folder = getFolder(plugin, file); if (!folder) return; removeCSSClassFromEL(folder.path, 'has-folder-note'); - await plugin.app.vault.delete(file); + switch (plugin.settings.deleteFilesAction) { + case 'trash': + await plugin.app.vault.trash(file, true); + break; + case 'obsidianTrash': + console.log('obsidianTrash'); + await plugin.app.vault.trash(file, false); + break; + case 'delete': + await plugin.app.vault.delete(file); + break; + } } export function extractFolderName(template: string, changedFileName: string) { diff --git a/src/modals/DeleteConfirmation.ts b/src/modals/DeleteConfirmation.ts index 863c175..f6cf756 100644 --- a/src/modals/DeleteConfirmation.ts +++ b/src/modals/DeleteConfirmation.ts @@ -1,6 +1,6 @@ import { App, Modal, Setting, TFile, Platform } from 'obsidian'; import FolderNotesPlugin from '../main'; -import { getFolder } from 'src/functions/folderNoteFunctions'; +import { deleteFolderNote, getFolder } from 'src/functions/folderNoteFunctions'; import { removeCSSClassFromEL } from 'src/functions/styleFunctions'; export default class DeleteConfirmationModal extends Modal { plugin: FolderNotesPlugin; @@ -13,59 +13,60 @@ export default class DeleteConfirmationModal extends Modal { this.file = file; } onOpen() { - const { contentEl } = this; - contentEl.createEl('h2', { text: 'Delete folder note' }); - const setting = new Setting(contentEl); - setting.infoEl.createEl('p', { text: `Are you sure you want to delete the folder note "${this.file.name}" ?` }); - setting.infoEl.createEl('p', { text: 'It will be moved to your system trash.' }); + const { contentEl, plugin } = this; + const modalTitle = contentEl.createDiv({ cls: 'fn-modal-title' }); + const modalContent = contentEl.createDiv({ cls: 'fn-modal-content' }); + modalTitle.createEl('h2', { text: 'Delete folder note' }); + modalContent.createEl('p', { text: `Are you sure you want to delete the folder note "${this.file.name}" ?` }); + switch (plugin.settings.deleteFilesAction) { + case 'trash': + modalContent.createEl('p', { text: 'It will be moved to your system trash.' }); + break; + case 'obsidianTrash': + modalContent.createEl('p', { text: 'It will be moved to your Obsidian trash, which is located in the ".trash" hidden folder in your vault.' }); + break; + case 'delete': + modalContent.createEl('p', { text: 'It will be permanently deleted.' }).setCssStyles({ color: 'red' }); + break; + } - setting.infoEl.parentElement?.classList.add('fn-delete-confirmation-modal'); + const buttonContainer = contentEl.createEl('div', { cls: 'modal-button-container' }); - // Create a container for the buttons and the checkbox - const buttonContainer = setting.infoEl.createEl('div', { cls: 'fn-delete-confirmation-modal-buttons' }); - if (Platform.isMobileApp) { - const confirmButton = buttonContainer.createEl('button', { text: 'Delete and don\'t ask again' }); - confirmButton.classList.add('mod-warning', 'fn-confirmation-modal-button'); - confirmButton.addEventListener('click', async () => { - this.plugin.settings.showDeleteConfirmation = false; - this.plugin.saveSettings(); - this.close(); - const folder = getFolder(this.plugin, this.file); - if (!folder) return; - removeCSSClassFromEL(folder?.path, 'has-folder-note'); - this.app.vault.delete(this.file); - }); - } else { - const checkbox = buttonContainer.createEl('input', { type: 'checkbox' }); - checkbox.addEventListener('change', (e) => { + if (!Platform.isMobile) { + const checkbox = buttonContainer.createEl('label', { cls: 'mod-checkbox' }) + checkbox.tabIndex = -1 + const input = checkbox.createEl('input', { type: 'checkbox' }); + checkbox.appendText('Don\'t ask again') + input.addEventListener('change', (e) => { const target = e.target as HTMLInputElement; if (target.checked) { - this.plugin.settings.showDeleteConfirmation = false; + plugin.settings.showDeleteConfirmation = false; } else { - this.plugin.settings.showDeleteConfirmation = true; + plugin.settings.showDeleteConfirmation = true; } - this.plugin.saveSettings(); + plugin.saveSettings(); }); - const checkBoxText = buttonContainer.createEl('span', { text: 'Don\'t ask again' }); - checkBoxText.addEventListener('click', () => { - checkbox.click(); + } else { + const confirmButton = buttonContainer.createEl('button', { text: 'Delete and don\'t ask again', cls: 'mod-destructive' }); + confirmButton.addEventListener('click', async () => { + plugin.settings.showDeleteConfirmation = false; + plugin.saveSettings(); + this.close(); + deleteFolderNote(plugin, this.file, false); }); } - const button = buttonContainer.createEl('button', { text: 'Delete' }); - button.classList.add('mod-warning', 'fn-confirmation-modal-button'); - button.addEventListener('click', async () => { + + const deleteButton = buttonContainer.createEl('button', { text: 'Delete', cls: 'mod-warning' }); + deleteButton.addEventListener('click', async () => { this.close(); - const folder = getFolder(this.plugin, this.file); - if (!folder) return; - removeCSSClassFromEL(folder.path, 'has-folder-note'); - this.app.vault.delete(this.file); + deleteFolderNote(plugin, this.file, false); }); - button.focus(); - const cancelButton = buttonContainer.createEl('button', { text: 'Cancel' }); + deleteButton.focus(); + + const cancelButton = buttonContainer.createEl('button', { text: 'Cancel', cls: 'mod-cancel' }); cancelButton.addEventListener('click', async () => { this.close(); }); - } onClose() { const { contentEl } = this; diff --git a/src/settings/GeneralSettings.ts b/src/settings/GeneralSettings.ts index a6d8728..2ae97af 100644 --- a/src/settings/GeneralSettings.ts +++ b/src/settings/GeneralSettings.ts @@ -278,6 +278,35 @@ export async function renderGeneral(settingsTab: SettingsTab) { settingsTab.display(); }) ); + + new Setting(containerEl) + .setName('Confirm folder note deletion') + .setDesc('Ask for confirmation before deleting a folder note') + .addToggle((toggle) => + toggle + .setValue(settingsTab.plugin.settings.showDeleteConfirmation) + .onChange(async (value) => { + settingsTab.plugin.settings.showDeleteConfirmation = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + }) + ); + + new Setting(containerEl) + .setName('Deleted folder notes') + .setDesc('What happens to the folder note after you delete it') + .addDropdown((dropdown) => { + dropdown.addOption('trash', 'Move to system trash'); + dropdown.addOption('obsidianTrash', 'Move to Obsidian trash (.trash folder)'); + dropdown.addOption('delete', 'Delete permanently'); + dropdown.setValue(settingsTab.plugin.settings.deleteFilesAction); + dropdown.onChange(async (value: 'trash' | 'delete' | 'obsidianTrash') => { + settingsTab.plugin.settings.deleteFilesAction = value; + await settingsTab.plugin.saveSettings(); + settingsTab.display(); + }); + }); + if (Platform.isDesktop) { const setting3 = new Setting(containerEl); setting3.setName('Open folder note in a new tab by default'); diff --git a/src/settings/SettingsTab.ts b/src/settings/SettingsTab.ts index 2631e30..fc0e096 100644 --- a/src/settings/SettingsTab.ts +++ b/src/settings/SettingsTab.ts @@ -59,6 +59,7 @@ export interface FolderNotesSettings { hideCollapsingIcon: boolean; ignoreAttachmentFolder: boolean; tabManagerEnabled: boolean; + deleteFilesAction: 'delete' | 'trash' | 'obsidianTrash'; } export const DEFAULT_SETTINGS: FolderNotesSettings = { @@ -147,6 +148,7 @@ export const DEFAULT_SETTINGS: FolderNotesSettings = { hideCollapsingIcon: false, tabManagerEnabled: true, ignoreAttachmentFolder: true, + deleteFilesAction: 'trash', }; export class SettingsTab extends PluginSettingTab {