diff --git a/src/folderOverview.ts b/src/folderOverview.ts index 257d92d..94d853a 100644 --- a/src/folderOverview.ts +++ b/src/folderOverview.ts @@ -10,6 +10,8 @@ export type yamlSettings = { style?: 'list' | 'grid'; disableFileTag?: boolean; sortBy?: 'name' | 'created' | 'modified' | 'nameAsc' | 'createdAsc' | 'modifiedAsc'; + showEmptyFolders?: boolean; + onlyIncludeSubfolders?: boolean; }; export function createCanvasOverview() { @@ -18,7 +20,7 @@ export function createCanvasOverview() { export function createOverview(plugin: FolderNotesPlugin, source: string, el: HTMLElement, ctx: MarkdownPostProcessorContext) { // parse source to yaml - let yaml = parseYaml(source); + let yaml: yamlSettings = parseYaml(source); if (!yaml) { yaml = { title: plugin.settings.defaultOverview.title, @@ -29,17 +31,20 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT style: plugin.settings.defaultOverview.style, disableFileTag: plugin.settings.defaultOverview.disableFileTag, sortBy: plugin.settings.defaultOverview.sortBy, + showEmptyFolders: plugin.settings.defaultOverview.showEmptyFolders, + onlyIncludeSubfolders: plugin.settings.defaultOverview.onlyIncludeSubfolders, }; } const depth = yaml?.depth || 1; let title = yaml?.title || plugin.settings.defaultOverview.title || '{{folderName}} overview'; const folderName = extractFolderName(plugin.settings.folderNoteName, plugin.removeExtension(plugin.getFolderNameFromPathString(ctx.sourcePath))); - title = title.replaceAll('{{folderName}}', folderName); + title = title.replaceAll('{{folderName}}', folderName || ''); const disableTitle = yaml?.disableTitle || plugin.settings.defaultOverview.disableTitle || false; let includeTypes: string[] = yaml?.includeTypes || plugin.settings.defaultOverview.includeTypes || ['folder', 'markdown']; includeTypes = includeTypes.map((type) => type.toLowerCase()); const style: 'list' | 'grid' = yaml?.style || 'list'; const disableFileTag = yaml?.disableFileTag || plugin.settings.defaultOverview.disableFileTag || false; + const showEmptyFolders = yaml?.showEmptyFolders || plugin.settings.defaultOverview.showEmptyFolders || false; const root = el.createEl('div', { cls: 'folder-overview' }); const titleEl = root.createEl('h1', { cls: 'folder-overview-title' }); @@ -122,8 +127,9 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT root.appendChild(folderElement); */ } - if (includeTypes.length > 1 && style !== 'grid') { - removeEmptyFolders(ul); + if (includeTypes.length > 1 && style !== 'grid' && (!showEmptyFolders || yaml.onlyIncludeSubfolders)) { + console.log('depth', depth, yaml.onlyIncludeSubfolders); + removeEmptyFolders(ul, 1, yaml); } } @@ -205,7 +211,7 @@ function sortFiles(files: TAbstractFile[], yaml: yamlSettings, plugin: FolderNot }); } -function removeEmptyFolders(ul: HTMLUListElement | HTMLLIElement) { +function removeEmptyFolders(ul: HTMLUListElement | HTMLLIElement, depth: number, yaml: yamlSettings) { const childrensToRemove: ChildNode[] = []; ul.childNodes.forEach((el) => { const childrens = (el as Element).querySelector('ul'); @@ -213,10 +219,11 @@ function removeEmptyFolders(ul: HTMLUListElement | HTMLLIElement) { if (childrens && !childrens?.hasChildNodes() && !(el instanceof HTMLUListElement)) { childrensToRemove.push(el); } else if (el instanceof HTMLUListElement || el instanceof HTMLLIElement) { - removeEmptyFolders(el); + removeEmptyFolders(el, depth + 1, yaml); } }); childrensToRemove.forEach((el) => { + if (yaml.onlyIncludeSubfolders && depth === 1) { return; } el.remove(); }); } diff --git a/src/modals/folderOverview.ts b/src/modals/folderOverview.ts index e5f1601..86fab0e 100644 --- a/src/modals/folderOverview.ts +++ b/src/modals/folderOverview.ts @@ -25,6 +25,8 @@ export class FolderOverviewSettings extends Modal { style: this.plugin.settings.defaultOverview.style, disableFileTag: this.plugin.settings.defaultOverview.disableFileTag, sortBy: this.plugin.settings.defaultOverview.sortBy, + showEmptyFolders: this.plugin.settings.defaultOverview.showEmptyFolders, + onlyIncludeSubfolders: this.plugin.settings.defaultOverview.onlyIncludeSubfolders, }; } } @@ -166,6 +168,32 @@ export class FolderOverviewSettings extends Modal { }) ); + new Setting(contentEl) + .setName('Show folder names of empty folders') + .setDesc('That includes subfolders of the current folder when you are on file depth 1') + .addToggle((toggle) => { + toggle + .setValue(this.yaml.showEmptyFolders || this.plugin.settings.defaultOverview.showEmptyFolders || false) + .onChange(async (value) => { + this.yaml.showEmptyFolders = value; + this.yaml.onlyIncludeSubfolders = false; + await this.updateYaml(); + }); + }); + + if (this.yaml.showEmptyFolders) { + new Setting(contentEl) + .setName('Only show first empty subfolders of current folder') + .addToggle((toggle) => { + toggle + .setValue(this.yaml.onlyIncludeSubfolders || this.plugin.settings.defaultOverview.onlyIncludeSubfolders || false) + .onChange(async (value) => { + this.yaml.onlyIncludeSubfolders = value; + await this.updateYaml(); + }); + }); + } + } onClose() { diff --git a/tsconfig.json b/tsconfig.json index 2d6fbdf..bffe2fa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,8 @@ "DOM", "ES5", "ES6", - "ES7" + "ES7", + "ES2021" ] }, "include": [