/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ 'use strict'; var obsidian = require('obsidian'); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } const COLLAPSE_ALL_ICON = ''; const EXPAND_ALL_ICON = ''; const DEFAULT_SETTINGS = { commands: { global: true, FileExplorer: false, TagPane: false }, folderContextMenu: true, expandAttachmentFolder: false, splitButtons: false }; var ProviderType; (function (ProviderType) { ProviderType["FileExplorer"] = "FileExplorer"; ProviderType["TagPane"] = "TagPane"; })(ProviderType || (ProviderType = {})); class ProviderBase { constructor(plugin) { this.plugin = plugin; } /** * Collapse command config */ get collapseCommand() { return { id: `collapse-all-collapse-${this.leafType}`, name: this.collapseCommandName, icon: 'double-up-arrow-glyph', callback: () => { this.collapseAll(); } }; } /** * Expand command config */ get expandCommand() { return { id: `collapse-all-expand-${this.leafType}`, name: this.expandCommandName, icon: 'double-down-arrow-glyph', callback: () => { this.expandAll(); } }; } /** * Collapse all open items in the given leaf or all leaves */ collapseAll(updateIcon = true, singleLeaf = null) { const leaves = singleLeaf ? [singleLeaf] : this.leaves; leaves.forEach((leaf) => { this.collapseOrExpandAll(leaf, true); if (updateIcon) { this.updateButtonIcon(leaf, undefined, true); } }); } /** * Expand all collapsed items in the given leaf or all leaves */ expandAll(updateIcon = true, singleLeaf = null) { const leaves = singleLeaf ? [singleLeaf] : this.leaves; leaves.forEach((leaf) => { this.collapseOrExpandAll(leaf, false); if (updateIcon) { this.updateButtonIcon(leaf, undefined, false); } }); } /** * Adds collapse buttons to all leaves. */ addButtons() { this.leaves.forEach((leaf) => { const container = leaf.view.containerEl; const navContainer = container.querySelector('div.nav-buttons-container'); if (!navContainer) { return null; } if (!this.plugin.settings.splitButtons) { this.addSingleButton(leaf, navContainer); } else { this.addSplitButtons(leaf, navContainer); } }); } addSingleButton(leaf, navContainer) { const existingButton = this.getCollapseButtons(leaf)[0]; if (existingButton) { return; } const newIcon = document.createElement('div'); this.updateButtonIcon(leaf, newIcon); newIcon.className = `${this.collapseButtonClass} collapse-all-plugin-button`; this.plugin.registerDomEvent(newIcon, 'click', () => { this.onSingleButtonClick(leaf); }); navContainer.appendChild(newIcon); // Register click handler on leaf to toggle button icon const handler = () => { this.updateButtonIcon(leaf, newIcon); }; leaf.view.containerEl.on('click', this.collapseClickTarget, handler); this.plugin.register(() => { leaf.view.containerEl.off('click', this.collapseClickTarget, handler); }); } addSplitButtons(leaf, navContainer) { const existingButtons = this.getCollapseButtons(leaf); if (existingButtons.length == 2) { return; } // Add collapse button const collapseButton = document.createElement('div'); this.updateButtonIcon(leaf, collapseButton, false); collapseButton.className = `${this.collapseButtonClass} collapse-all-plugin-button`; this.plugin.registerDomEvent(collapseButton, 'click', () => { this.collapseAll(false, leaf); }); navContainer.appendChild(collapseButton); // Add expand button const expandButton = document.createElement('div'); this.updateButtonIcon(leaf, expandButton, true); expandButton.className = `${this.collapseButtonClass} collapse-all-plugin-button`; this.plugin.registerDomEvent(expandButton, 'click', () => { this.expandAll(false, leaf); }); navContainer.appendChild(expandButton); } /** * Refresh icons for all leaves to the correct state. */ updateButtonIcons() { this.leaves.forEach((leaf) => { this.updateButtonIcon(leaf); }); } /** * Remove the collapse button from all leaves. */ removeCollapseButtons() { this.leaves.forEach((leaf) => { const buttons = this.getCollapseButtons(leaf); buttons.forEach((button) => { button.remove(); }); }); } /** * Returns all loaded leaves of the class leafType */ get leaves() { return this.plugin.app.workspace.getLeavesOfType(this.leafType); } /** * Get the collapse button for a given leaf, if it exists */ getCollapseButtons(leaf) { return leaf.view.containerEl.querySelectorAll('.collapse-all-plugin-button'); } /** * Update icon for given leaf/button to collapse/expand all. * Providing the forceAllCollapsed parameter will skip checking and assume that state */ updateButtonIcon(leaf, button, forceAllCollapsed) { if (!button) { button = this.getCollapseButtons(leaf)[0] || null; } if (button && forceAllCollapsed === undefined) { const allCollapsed = this.allCollapsed(leaf); button.innerHTML = allCollapsed ? EXPAND_ALL_ICON : COLLAPSE_ALL_ICON; button.setAttribute('aria-label', allCollapsed ? 'Expand all' : 'Collapse all'); } else if (button) { button.innerHTML = forceAllCollapsed ? EXPAND_ALL_ICON : COLLAPSE_ALL_ICON; button.setAttribute('aria-label', forceAllCollapsed ? 'Expand all' : 'Collapse all'); } } /** * Collapses or expands all items in the given leaf */ onSingleButtonClick(leaf) { if (leaf) { if (this.allCollapsed(leaf)) { this.expandAll(true, leaf); } else { this.collapseAll(true, leaf); } } } } class FileExplorerProvider extends ProviderBase { constructor(plugin) { super(plugin); this.providerType = ProviderType.FileExplorer; this.displayName = 'File Explorer'; this.collapseButtonClass = 'clickable-icon nav-action-button'; this.collapseClickTarget = '.nav-folder-title'; this.leafType = 'file-explorer'; this.collapseCommandName = 'Collapse open folders in all file explorers'; this.expandCommandName = 'Expand closed folders in all file explorers'; } handleMenu(menu, file, source) { if (this.plugin.settings.folderContextMenu && source === 'file-explorer-context-menu' && file instanceof obsidian.TFolder) { const leaf = this.plugin.app.workspace .getLeavesOfType('file-explorer') .first(); menu.addItem((item) => { item .setTitle('Collapse this level') .setIcon('double-up-arrow-glyph') .onClick(() => this.collapseOrExpandAll(leaf, true, file)); }); menu.addItem((item) => { item .setTitle('Expand this level') .setIcon('double-down-arrow-glyph') .onClick(() => this.collapseOrExpandAll(leaf, false, file)); }); } } collapseOrExpandAll(leaf, collapsed, parentFolder = null) { let items = []; if (parentFolder) { items = this.getCurrentLevelItems(leaf, parentFolder); } else { items = this.getExplorerItems(leaf); } items.forEach((item) => { if (this.explorerItemIsFolder(item) && item.collapsed !== collapsed) { if (collapsed === false && this.expandAttachmentFolder === false && this.folderIsAttachmentFolder(item.file)) { return; } item.setCollapsed(collapsed); } }); } allCollapsed(leaf) { const items = this.getExplorerItems(leaf); return items.every((i) => !this.explorerItemIsFolder(i) || i.collapsed === true); } get attachmentFolder() { return this.plugin.app.vault.config.attachmentFolderPath || ''; } get expandAttachmentFolder() { return this.plugin.settings.expandAttachmentFolder; } /** * Get all `fileItems` on explorer view. This property is not documented. */ getExplorerItems(leaf) { return Object.values(leaf.view.fileItems); } /** * Get all FileExplorerItems that are descendants of the current folder */ getCurrentLevelItems(leaf, parentFolder) { const allItems = this.getExplorerItems(leaf); // This is a very naiive but cheap way to do this. return allItems.filter((item) => item.file.path.startsWith(`${parentFolder.path}/`) || item.file.path === parentFolder.path); } /** * Ensures given explorer item is a folder and not the root or a note */ explorerItemIsFolder(item) { return (item.file instanceof obsidian.TFolder && item.file.path !== '/' && item.collapsed !== undefined); } folderIsAttachmentFolder(folder) { if (!this.attachmentFolder || this.attachmentFolder === './') { return false; } if (folder.path === this.attachmentFolder) { return true; } if (this.attachmentFolder.startsWith('./') && folder.path.endsWith(this.attachmentFolder.slice(1))) { return true; } return false; } } class TagPaneProvider extends ProviderBase { constructor(plugin) { super(plugin); this.providerType = ProviderType.TagPane; this.displayName = 'Tag Pane'; this.collapseButtonClass = 'clickable-icon nav-action-button'; this.collapseClickTarget = '.tag-container .tree-item'; this.leafType = 'tag'; this.collapseCommandName = 'Collapse open tags in all tag explorers'; this.expandCommandName = 'Expand closed tags in all tag explorers'; } collapseOrExpandAll(leaf, collapsed) { // Get tags const items = this.getTagItems(leaf); // Collapse / expand items.forEach((item) => { if (this.getChildrenSafe(item).length > 0 && item.collapsed !== collapsed) { item.setCollapsed(collapsed); } }); } allCollapsed(leaf) { return this.tagsAreCollapsed(this.getTagItems(leaf)); } /** * Get the root tag pane items from the tag pane view. This property is not documented. */ getTagItems(tagPane) { return Object.values(tagPane.view.tagDoms); } /** * Given the root tags, checks all children to confirm they are closed. Note that this is recursive. */ tagsAreCollapsed(items) { return items.every((i) => this.getChildrenSafe(i).length === 0 || i.collapsed === true); } getChildrenSafe(item) { var _a; return (_a = item.children) !== null && _a !== void 0 ? _a : item.vChildren.children; } } class CollapseAllPluginSettings extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { this.containerEl.empty(); this.containerEl.createEl('h2', { text: 'Collapse all plugin settings.' }); new obsidian.Setting(this.containerEl) .setName('Split buttons') .setDesc('If enabled, instead of swapping between collapse and expand, there will be two separate buttons, one for collapse and one for expand.') .addToggle((toggle) => { toggle .setTooltip('Split buttons') .setValue(this.plugin.settings.splitButtons) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.splitButtons = value; this.plugin.onunload(); this.plugin.allProviders.forEach((provider) => { provider.addButtons(); }); yield this.plugin.saveSettings(); })); }); new obsidian.Setting(this.containerEl) .setName('Folder context menu') .setDesc('If enabled, add commands to the folder right-click context menu to collapse and expand that folder and its children only.') .addToggle((toggle) => { toggle .setTooltip('Folder context menu') .setValue(this.plugin.settings.folderContextMenu) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.folderContextMenu = value; yield this.plugin.saveSettings(); })); }); new obsidian.Setting(this.containerEl) .setName('Expand attachment folder') .setDesc('If enabled, the attachment folder will be expanded with other folders. Otherwise, it will be skipped.') .addToggle((toggle) => { toggle .setTooltip('Expand attachment folder') .setValue(this.plugin.settings.expandAttachmentFolder) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.expandAttachmentFolder = value; yield this.plugin.saveSettings(); })); }); this.containerEl.createEl('h3', { text: 'Command settings' }); this.containerEl.createEl('p', { text: 'Each toggle controls whether commands should be added to collapse and expand that view, or global which operates on all available views. Updates on app reload.' }); // Add global toggle new obsidian.Setting(this.containerEl).setName('Global').addToggle((toggle) => { toggle .setTooltip('Global') .setValue(this.plugin.settings.commands.global) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.commands.global = value; yield this.plugin.saveSettings(); })); }); // Add individual toggles this.plugin.allProviders.forEach((provider) => { new obsidian.Setting(this.containerEl) .setName(provider.displayName) .addToggle((toggle) => { toggle .setTooltip(provider.displayName) .setValue(this.plugin.settings.commands[provider.providerType]) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.commands[provider.providerType] = value; yield this.plugin.saveSettings(); })); }); }); } } class CollapseAllPlugin extends obsidian.Plugin { constructor() { super(...arguments); this.settings = DEFAULT_SETTINGS; this.providers = { [ProviderType.FileExplorer]: new FileExplorerProvider(this), [ProviderType.TagPane]: new TagPaneProvider(this) }; } get allProviders() { return Object.values(this.providers); } onload() { return __awaiter(this, void 0, void 0, function* () { // Load settings this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); // Initialize this.app.workspace.onLayoutReady(() => { this.allProviders.forEach((provider) => { provider.addButtons(); }); }); this.app.workspace.on('file-menu', (menu, file, source) => { this.providers.FileExplorer.handleMenu(menu, file, source); }); // File explorers that get opened later on this.registerEvent(this.app.workspace.on('layout-change', () => { this.allProviders.forEach((provider) => { provider.addButtons(); }); })); // Update icon when files are opened this.registerEvent(this.app.workspace.on('file-open', () => { if (!this.settings.splitButtons) { this.allProviders.forEach((provider) => { provider.updateButtonIcons(); }); } })); if (this.settings.commands.global) { // Add global collapse command to palette this.addCommand({ id: 'collapse-all-collapse', name: 'Collapse open items in all supported explorers', icon: 'double-up-arrow-glyph', callback: () => { this.allProviders.forEach((provider) => { provider.collapseAll(); }); } }); // Add global expand command to palette this.addCommand({ id: 'collapse-all-expand', name: 'Expand closed items in all supported explorers', icon: 'double-down-arrow-glyph', callback: () => { this.allProviders.forEach((provider) => { provider.expandAll(); }); } }); } // Add individual commands for each provider this.allProviders.forEach((provider) => { if (this.settings.commands[provider.providerType]) { this.addCommand(provider.collapseCommand); this.addCommand(provider.expandCommand); } }); // Add settings tab this.addSettingTab(new CollapseAllPluginSettings(this.app, this)); }); } onunload() { // Remove all collapse buttons this.allProviders.forEach((provider) => { provider.removeCollapseButtons(); }); } saveSettings() { return this.saveData(this.settings); } } module.exports = CollapseAllPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jb25zdGFudHMudHMiLCJzcmMvcHJvdmlkZXIvYmFzZS50cyIsInNyYy9wcm92aWRlci9maWxlLWV4cGxvcmVyLnRzIiwic3JjL3Byb3ZpZGVyL3RhZy1wYW5lLnRzIiwic3JjL3NldHRpbmdzLnRzIiwic3JjL3BsdWdpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6bnVsbCwibmFtZXMiOlsiVEZvbGRlciIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFB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