/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/main.ts var main_exports = {}; __export(main_exports, { DEFAULT_SETTINGS: () => DEFAULT_SETTINGS, default: () => DNPlugin }); module.exports = __toCommonJS(main_exports); var import_obsidian4 = require("obsidian"); // src/settings.ts var import_obsidian = require("obsidian"); var DNSettingTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); new import_obsidian.Setting(containerEl).setName("Open dashboard navigator").addButton((btn) => { btn.setButtonText("Open").setTooltip("Open dashboard navigator").onClick((evt) => { this.plugin.DN_MODAL.open(); }); }); new import_obsidian.Setting(containerEl).setName("Default view").setDesc("Select view when opening window").addDropdown((sel) => { this.dropdownDefaultView = sel; sel.addOption("1", "Dashboard"); sel.addOption("2", "Navigator"); sel.onChange(async (val) => { this.plugin.settings.default_view = parseInt(val); this.plugin.DN_MODAL.default_view = this.plugin.settings.default_view; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.default_view.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownDefaultView.setValue(DEFAULT_SETTINGS.default_view.toString()); this.plugin.settings.default_view = DEFAULT_SETTINGS.default_view; this.plugin.DN_MODAL.default_view = this.plugin.settings.default_view; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Navigator table layout").setDesc("Select table results layout").addDropdown((sel) => { this.dropdownTableLayout = sel; sel.addOption("dn-tbl-default", "Default"); sel.addOption("dn-tbl-row", "Row striped"); sel.addOption("dn-tbl-column", "Column striped"); sel.addOption("dn-tbl-bordered", "Bordered"); sel.onChange(async (val) => { this.plugin.settings.selected_table_layout = val; this.plugin.DN_MODAL.selected_table_layout = this.plugin.settings.selected_table_layout; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.selected_table_layout.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownTableLayout.setValue(DEFAULT_SETTINGS.selected_table_layout.toString()); this.plugin.settings.selected_table_layout = DEFAULT_SETTINGS.selected_table_layout; this.plugin.DN_MODAL.selected_table_layout = this.plugin.settings.selected_table_layout; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Date format").setDesc("Select date format").addDropdown((sel) => { this.dropdownDateFormat = sel; sel.addOption("YYYY-MM-DD HH:mm:ss", "YYYY-MM-DD HH:mm:ss"); sel.addOption("YYYY-MM-DD HH:mm", "YYYY-MM-DD HH:mm"); sel.addOption("YYYY-MM-DD", "YYYY-MM-DD"); sel.addOption("DD/MM/YYYY HH:mm:ss", "DD/MM/YYYY HH:mm:ss"); sel.addOption("DD/MM/YYYY HH:mm", "DD/MM/YYYY HH:mm"); sel.addOption("DD/MM/YYYY", "DD/MM/YYYY"); sel.onChange(async (val) => { this.plugin.settings.date_format = val; this.plugin.DN_MODAL.date_format = this.plugin.settings.date_format; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.date_format.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownDateFormat.setValue(DEFAULT_SETTINGS.date_format.toString()); this.plugin.settings.date_format = DEFAULT_SETTINGS.date_format; this.plugin.DN_MODAL.date_format = this.plugin.settings.date_format; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Font size").setDesc("Select font size in pixels for results and links").addSlider((sli) => { this.sliderFontSize = sli; let slider_val; if (this.plugin.settings.font_size) { slider_val = this.plugin.settings.font_size; } else { slider_val = DEFAULT_SETTINGS.font_size; } sli.setDynamicTooltip(); sli.setLimits(12, 24, 1); sli.setValue(slider_val); sli.onChange((val) => { this.plugin.settings.font_size = val; this.plugin.dnSetFontSize(val); this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.sliderFontSize.setValue(DEFAULT_SETTINGS.font_size); this.plugin.settings.font_size = DEFAULT_SETTINGS.font_size; this.plugin.dnSetFontSize(this.plugin.settings.font_size); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Files per page").setDesc("Number of results per page").addDropdown((sel) => { this.dropdownFilesPerPage = sel; sel.addOption("10", "10"); sel.addOption("20", "20"); sel.addOption("30", "30"); sel.addOption("50", "50"); sel.addOption("100", "100"); sel.onChange(async (val) => { this.plugin.settings.files_per_page = parseInt(val); this.plugin.DN_MODAL.files_per_page = this.plugin.settings.files_per_page; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.files_per_page.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownFilesPerPage.setValue(DEFAULT_SETTINGS.files_per_page.toString()); this.plugin.settings.files_per_page = DEFAULT_SETTINGS.files_per_page; this.plugin.DN_MODAL.files_per_page = this.plugin.settings.files_per_page; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Recent files").setDesc("Number of recent files per category").addDropdown((sel) => { this.dropdownRecentFiles = sel; sel.addOption("3", "3"); sel.addOption("4", "4"); sel.addOption("5", "5"); sel.addOption("10", "10"); sel.onChange(async (val) => { this.plugin.settings.num_recent_files = parseInt(val); this.plugin.DN_MODAL.num_recent_files = this.plugin.settings.num_recent_files; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.num_recent_files.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownRecentFiles.setValue(DEFAULT_SETTINGS.num_recent_files.toString()); this.plugin.settings.num_recent_files = DEFAULT_SETTINGS.num_recent_files; this.plugin.DN_MODAL.num_recent_files = this.plugin.settings.num_recent_files; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Ext").setDesc("Navigator: Hide file extension column").addToggle((toggle) => { this.toggleHideExtColumn = toggle; toggle.setValue(this.plugin.settings.hide_ext).onChange(async (val) => { this.plugin.settings.hide_ext = val; this.plugin.dnUpdateHideColumn("ext", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHideExtColumn.setValue(DEFAULT_SETTINGS.hide_ext); this.plugin.settings.hide_ext = DEFAULT_SETTINGS.hide_ext; this.plugin.dnUpdateHideColumn("ext", DEFAULT_SETTINGS.hide_ext); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Path").setDesc("Navigator: Hide path column").addToggle((toggle) => { this.toggleHidePathColumn = toggle; toggle.setValue(this.plugin.settings.hide_path).onChange(async (val) => { this.plugin.settings.hide_path = val; this.plugin.dnUpdateHideColumn("path", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHidePathColumn.setValue(DEFAULT_SETTINGS.hide_path); this.plugin.settings.hide_path = DEFAULT_SETTINGS.hide_path; this.plugin.dnUpdateHideColumn("path", DEFAULT_SETTINGS.hide_path); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Size").setDesc("Navigator: Hide size column").addToggle((toggle) => { this.toggleHideSizeColumn = toggle; toggle.setValue(this.plugin.settings.hide_size).onChange(async (val) => { this.plugin.settings.hide_size = val; this.plugin.dnUpdateHideColumn("size", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHideSizeColumn.setValue(DEFAULT_SETTINGS.hide_size); this.plugin.settings.hide_size = DEFAULT_SETTINGS.hide_size; this.plugin.dnUpdateHideColumn("size", DEFAULT_SETTINGS.hide_size); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Date").setDesc("Navigator: Hide date column").addToggle((toggle) => { this.toggleHideDateColumn = toggle; toggle.setValue(this.plugin.settings.hide_date).onChange(async (val) => { this.plugin.settings.hide_date = val; this.plugin.dnUpdateHideColumn("date", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHideDateColumn.setValue(DEFAULT_SETTINGS.hide_date); this.plugin.settings.hide_date = DEFAULT_SETTINGS.hide_date; this.plugin.dnUpdateHideColumn("date", DEFAULT_SETTINGS.hide_date); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Tags").setDesc("Navigator: Hide tags column").addToggle((toggle) => { this.toggleHideTagsColumn = toggle; toggle.setValue(this.plugin.settings.hide_tags).onChange(async (val) => { this.plugin.settings.hide_tags = val; this.plugin.dnUpdateHideColumn("tags", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHideTagsColumn.setValue(DEFAULT_SETTINGS.hide_tags); this.plugin.settings.hide_tags = DEFAULT_SETTINGS.hide_tags; this.plugin.dnUpdateHideColumn("tags", DEFAULT_SETTINGS.hide_tags); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hide column: Frontmatter").setDesc("Navigator: Hide frontmatter properties column").addToggle((toggle) => { this.toggleHideFrontmatterColumn = toggle; toggle.setValue(this.plugin.settings.hide_frontmatter).onChange(async (val) => { this.plugin.settings.hide_frontmatter = val; this.plugin.dnUpdateHideColumn("frontmatter", val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleHideFrontmatterColumn.setValue(DEFAULT_SETTINGS.hide_frontmatter); this.plugin.settings.hide_frontmatter = DEFAULT_SETTINGS.hide_frontmatter; this.plugin.dnUpdateHideColumn("frontmatter", DEFAULT_SETTINGS.hide_frontmatter); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Excluded file extensions").setDesc("File extensions to exclude, separated by commas").addText((text) => { this.textExcludedExtensions = text; text.setPlaceholder("File extensions to exclude").setValue(this.plugin.settings.excluded_ext).onChange(async (val) => { this.plugin.settings.excluded_ext = val; this.plugin.DN_MODAL.excluded_extensions = this.plugin.dnGetExcludedExtensions(val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.textExcludedExtensions.setValue(""); this.plugin.settings.excluded_ext = ""; this.plugin.DN_MODAL.excluded_extensions = []; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Excluded folders").setDesc("List of folder paths to exclude, separated by commas").addText((text) => { this.textExcludedFolders = text; text.setPlaceholder("Folder paths to exclude").setValue(this.plugin.settings.excluded_path).onChange(async (val) => { this.plugin.settings.excluded_path = val; this.plugin.DN_MODAL.excluded_folders = this.plugin.dnGetExcludedFolders(val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.textExcludedFolders.setValue(""); this.plugin.settings.excluded_path = ""; this.plugin.DN_MODAL.excluded_folders = []; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Toggle colored files").setDesc("Turn on/off colored files").addToggle((toggle) => { this.toggleColoredFiles = toggle; toggle.setValue(this.plugin.settings.colored_files).onChange(async (val) => { this.plugin.settings.colored_files = val; this.plugin.DN_MODAL.colored_files = val; this.plugin.DN_MODAL.dnToggleColoredFiles(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleColoredFiles.setValue(DEFAULT_SETTINGS.colored_files); this.plugin.settings.colored_files = DEFAULT_SETTINGS.colored_files; this.plugin.DN_MODAL.colored_files = DEFAULT_SETTINGS.colored_files; this.plugin.DN_MODAL.dnToggleColoredFiles(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Notes").setDesc("Color of notes").addColorPicker((color) => { this.colorCompNotes = color; color.setValue(this.plugin.settings.color_notes).onChange(async (val) => { this.plugin.settings.color_notes = val; this.plugin.DN_MODAL.color_notes = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompNotes.setValue(DEFAULT_SETTINGS.color_notes); this.plugin.settings.color_notes = DEFAULT_SETTINGS.color_notes; this.plugin.DN_MODAL.color_notes = DEFAULT_SETTINGS.color_notes; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Canvas").setDesc("Color of canvas").addColorPicker((color) => { this.colorCompCanvas = color; color.setValue(this.plugin.settings.color_canvas).onChange(async (val) => { this.plugin.settings.color_canvas = val; this.plugin.DN_MODAL.color_canvas = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompCanvas.setValue(DEFAULT_SETTINGS.color_canvas); this.plugin.settings.color_canvas = DEFAULT_SETTINGS.color_canvas; this.plugin.DN_MODAL.color_canvas = DEFAULT_SETTINGS.color_canvas; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Images").setDesc("Color of images").addColorPicker((color) => { this.colorCompImages = color; color.setValue(this.plugin.settings.color_images).onChange(async (val) => { this.plugin.settings.color_images = val; this.plugin.DN_MODAL.color_images = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompImages.setValue(DEFAULT_SETTINGS.color_images); this.plugin.settings.color_images = DEFAULT_SETTINGS.color_images; this.plugin.DN_MODAL.color_images = DEFAULT_SETTINGS.color_images; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Videos").setDesc("Color of videos").addColorPicker((color) => { this.colorCompVideos = color; color.setValue(this.plugin.settings.color_videos).onChange(async (val) => { this.plugin.settings.color_videos = val; this.plugin.DN_MODAL.color_videos = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompVideos.setValue(DEFAULT_SETTINGS.color_videos); this.plugin.settings.color_videos = DEFAULT_SETTINGS.color_videos; this.plugin.DN_MODAL.color_videos = DEFAULT_SETTINGS.color_videos; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Audios").setDesc("Color of audios").addColorPicker((color) => { this.colorCompAudios = color; color.setValue(this.plugin.settings.color_audios).onChange(async (val) => { this.plugin.settings.color_audios = val; this.plugin.DN_MODAL.color_audios = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompAudios.setValue(DEFAULT_SETTINGS.color_audios); this.plugin.settings.color_audios = DEFAULT_SETTINGS.color_audios; this.plugin.DN_MODAL.color_audios = DEFAULT_SETTINGS.color_audios; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: PDF").setDesc("Color of PDF files").addColorPicker((color) => { this.colorCompPdf = color; color.setValue(this.plugin.settings.color_pdf).onChange(async (val) => { this.plugin.settings.color_pdf = val; this.plugin.DN_MODAL.color_pdf = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompPdf.setValue(DEFAULT_SETTINGS.color_pdf); this.plugin.settings.color_pdf = DEFAULT_SETTINGS.color_pdf; this.plugin.DN_MODAL.color_pdf = DEFAULT_SETTINGS.color_pdf; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Other files").setDesc("Color of other files").addColorPicker((color) => { this.colorCompOther = color; color.setValue(this.plugin.settings.color_other).onChange(async (val) => { this.plugin.settings.color_other = val; this.plugin.DN_MODAL.color_other = val; this.plugin.DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompOther.setValue(DEFAULT_SETTINGS.color_other); this.plugin.settings.color_other = DEFAULT_SETTINGS.color_other; this.plugin.DN_MODAL.color_other = DEFAULT_SETTINGS.color_other; this.plugin.DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); } }; // src/dn.ts var import_obsidian2 = require("obsidian"); // src/utils/format.ts function formatFileSize(fileSize) { if (fileSize === 0) { return "0"; } const formattedSize = fileSize.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ","); return formattedSize; } function getFolderStructure(folder) { const folders = folder.split("/").slice(0, -1); if (folders.length === 0) { return "/"; } return "/" + folders.join("/"); } function formatFileSizeKBMB(total_bytes) { if (total_bytes < 1024) { return ""; } else if (total_bytes < 1048576) { return ` (${(total_bytes / 1024).toFixed(2)} KB)`; } else { return ` (${(total_bytes / (1024 * 1024)).toFixed(2)} MB)`; } } // src/utils/tags.ts function getTagsPerFile(file) { var _a, _b; const cur_file = this.app.vault.getAbstractFileByPath(file.path); if (cur_file !== null) { const tags = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.tags; const frontmatter_tags = (_b = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _b.frontmatter; const arrTags = []; if (tags) { for (let i = 0, len = tags.length; i < len; i++) { if (arrTags.indexOf(tags[i].tag) < 0) { arrTags.push(tags[i].tag); } } } if (frontmatter_tags !== void 0 && frontmatter_tags.tags) { for (let i = 0, len = frontmatter_tags.tags.length; i < len; i++) { const fmTag = "#" + frontmatter_tags.tags[i]; if (arrTags.indexOf(fmTag) < 0) { arrTags.push(fmTag); } } } return arrTags.join(" "); } else { return ""; } } function getPropsPerFile(file) { const fileProperties = []; const cache = this.app.metadataCache.getFileCache(file); if (cache == null ? void 0 : cache.frontmatter) { for (const [key, value] of Object.entries(cache.frontmatter)) { fileProperties.push(`'${key}: ${value}'`); } } return fileProperties.join(" \n"); } // src/utils/dnpiechart.ts var DNPieChart = class { constructor(canvas, margin = 10, fontSize = 12, legendWidth = 50, labelColor = "#828282") { this._canvas = canvas; const ctx = canvas.getContext("2d"); if (ctx) { this._ctx = ctx; } this._data = []; this._margin = margin; this._fontSize = fontSize; this._legendWidth = legendWidth; this._labelColor = labelColor; } addData(value, color, label) { this._data.push({ value, color, label }); } draw() { const { width, height } = this._canvas; const availWidth = width - 2 * this._margin; const availHeight = height - 2 * this._margin; const scale = Math.min(availWidth / width, availHeight / height); const radius = Math.min(availWidth, availHeight) / 2 * scale; this._cX = width / 2; this._cY = height / 2; this._ctx.clearRect(0, 0, width, height); const totalValue = this._data.reduce((acc, curr) => acc + curr.value, 0); let currentAngle = -Math.PI / 2; this._data.forEach((slice) => { const sliceAngle = slice.value / totalValue * 2 * Math.PI; this.drawSlice(radius, sliceAngle, slice.color, currentAngle); currentAngle += sliceAngle; }); this.drawLegend(2, 20); } drawSlice(radius, sliceAngle, color, startAngle) { this._ctx.beginPath(); this._ctx.arc(this._cX, this._cY, radius, startAngle, startAngle + sliceAngle); this._ctx.lineTo(this._cX, this._cY); this._ctx.fillStyle = color; this._ctx.closePath(); this._ctx.fill(); } drawLegend(x, y) { const lineHeight = this._fontSize + 5; this._data.forEach((slice, index) => { const textX = x + this._legendWidth / 5; const textY = y + index * lineHeight - 10; this._ctx.fillStyle = slice.color; this._ctx.fillRect(textX - 10, textY, 5, 5); this._ctx.fillStyle = this._labelColor; this._ctx.font = `${this._fontSize}px sans-serif`; this._ctx.fillText(`${slice.label} (${slice.value})`, textX, textY + 8); }); } }; // src/utils/dntablemanager.ts var DNTableManager = class { constructor(tbl) { this.table = document.querySelector(tbl); } getCells() { return this.table.querySelectorAll("td, th"); } hideColumns(columnNames) { const cells = this.getCells(); if (columnNames.length === 0) { for (let i = 0; i < cells.length; i++) { cells[i].classList.remove("dn-hidden"); } } else { for (let i = 0; i < cells.length; i++) { const colIndex = i % 7; const columnName = this.getColumnNames()[colIndex]; if (columnNames.includes(columnName)) { cells[i].classList.add("dn-hidden"); } else { cells[i].classList.remove("dn-hidden"); } } } } getColumnNames() { return ["name", "ext", "path", "size", "date", "tags", "frontmatter"]; } }; // src/dn.ts var import_obsidian3 = require("obsidian"); var DNModal = class extends import_obsidian2.Modal { constructor(app) { super(app); this._sort_order = "desc"; this._sort_column = "modified"; this._selected_category = ""; this._TABLE_LAYOUTS = ["dn-tbl-default", "dn-tbl-row", "dn-tbl-column", "dn-tbl-bordered"]; this.selected_table_layout = "dn-tbl-default"; this.selected_sort_value = "modified-desc"; this.num_recent_files = 5; this.files_per_page = 20; this.date_format = "YYYY-MM-DD HH:mm"; this.default_view = 1; this.excluded_extensions = []; this.excluded_folders = []; // File colors this.color_notes = "#bf48ff"; this.color_images = "#007fff"; this.color_canvas = "#ff7f28"; this.color_videos = "#d34848"; this.color_audios = "#bfbf00"; this.color_pdf = "#00a300"; this.color_other = "#828282"; this.colored_files = false; // Hide columns this.hide_columns = []; this._previewComponent = new import_obsidian2.Component(); this.dnHandleIntersection = (entries) => { entries.forEach((entry) => { if (!entry.isIntersecting) { entry.target.removeEventListener("contextmenu", this.dnHandleClick); entry.target.removeEventListener("click", this.dnHandleClick); entry.target.removeEventListener("dblclick", this.dnHandleDblClick); } }); }; this.intersectionObserver = new IntersectionObserver(this.dnHandleIntersection); } async onOpen() { var _a; const { contentEl } = this; this._previewComponent.load(); this._hoverDiv = this.contentEl.createEl("div", { cls: "dn-preview" }); await this.updateModalData(); const leaf = (_a = this.app.workspace) == null ? void 0 : _a.getMostRecentLeaf(); if (leaf !== null) { this._leaf = leaf; } this.dnCreateMainUI(contentEl); this.dnSetView(this.default_view); this.dnSetSelectLayoutValue(this.selected_table_layout); this.dnSetSelectSortValue(this.selected_sort_value); this.dnToggleColoredFiles(); this._isDraggingPreview = false; this._hoverDivLeft = ""; this._hoverDivTop = ""; } async updateModalData() { this._files = []; this._folders = []; this._recent = []; this._last_opened = []; this._notes = []; this._images = []; this._canvas = []; this._audios = []; this._videos = []; this._pdf = []; this._other = []; const dnFilesAndFolders = this.app.vault.getAllLoadedFiles(); for (const absF of dnFilesAndFolders) { if (absF instanceof import_obsidian2.TFile) { this._files.push(absF); } else if (absF instanceof import_obsidian2.TFolder && !absF.isRoot()) { this._folders.push(absF); } } this._files_excluded_filters = this._files.filter( (file) => { return !this.excluded_extensions.includes(file.extension.toLowerCase()) && !this.excluded_folders.some((folder) => file.path.startsWith(folder)); } ); this._files_results = this._files_excluded_filters; await this.dnOrganizeFiles({ arr: this._files_excluded_filters }); this._recent = await this.dnGetRecentFiles(this._files_excluded_filters); const arrStrLastOpened = this.app.workspace.getLastOpenFiles(); arrStrLastOpened.forEach(async (file) => { const f_temp = await this.app.vault.getAbstractFileByPath(file); if (f_temp instanceof import_obsidian2.TFile) { this._last_opened.push(f_temp); } }); } async dnCreateMainUI(el) { const mainContainer = el.createEl("div", { cls: "dn-container" }); mainContainer.setAttribute("id", "dn-container"); this.dnCreateInputSearch(mainContainer); const topNav = mainContainer.createEl("div", { cls: "dn-top-nav" }); const leftTopNav = topNav.createEl("div"); const rightTopNav = topNav.createEl("div"); this._BTN_DASHBOARD = leftTopNav.createEl("button", { text: "Dashboard", cls: "mod-cta" }); this._BTN_DASHBOARD.onClickEvent((evt) => { this.dnSetView(1); }); this._BTN_NAVIGATOR = leftTopNav.createEl("button", { text: "Navigator" }); this._BTN_NAVIGATOR.onClickEvent((evt) => { this.dnModalSearchVault(this._INPUT_SEARCH.value); this.dnSetView(2); }); this.labelLayout = rightTopNav.createEl("span", { text: "Layout:", cls: "dn-tbl-label" }); this.labelLayout.setAttribute("id", "dn-label-layout"); this._SELECT_TABLE_LAYOUT = rightTopNav.createEl("select", { cls: "dropdown tbl-select" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Default", value: "dn-tbl-default" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Row striped", value: "dn-tbl-row" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Column striped", value: "dn-tbl-column" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Bordered", value: "dn-tbl-bordered" }); this._SELECT_TABLE_LAYOUT.addEventListener("change", () => { this.dnSelectTableLayout(); }); this.labelSort = rightTopNav.createEl("span", { text: "Sort by:", cls: "dn-tbl-label" }); this.labelSort.setAttribute("id", "dn-label-sort"); this._SELECT_SORT = rightTopNav.createEl("select", { cls: "dropdown" }); this._SELECT_SORT.setAttribute("id", "dn-select-sort"); this._SELECT_SORT.addEventListener("change", () => { this.dnSortColumnWithSelect(); }); this._SELECT_SORT.createEl("option", { text: "Name (A to Z)", value: "name-asc" }); this._SELECT_SORT.createEl("option", { text: "Name (Z to A)", value: "name-desc" }); this._SELECT_SORT.createEl("option", { text: "Extension (A to Z)", value: "ext-asc" }); this._SELECT_SORT.createEl("option", { text: "Extension (Z to A)", value: "ext-desc" }); this._SELECT_SORT.createEl("option", { text: "Path (A to Z)", value: "path-asc" }); this._SELECT_SORT.createEl("option", { text: "Path (Z to A)", value: "path-desc" }); this._SELECT_SORT.createEl("option", { text: "Size (smallest to largest)", value: "size-asc" }); this._SELECT_SORT.createEl("option", { text: "Size (largest to smallest)", value: "size-desc" }); this._SELECT_SORT.createEl("option", { text: "Date/time (oldest to newest)", value: "modified-asc" }); this._SELECT_SORT.createEl("option", { text: "Date/time (newest to oldest)", value: "modified-desc" }); this._VIEW_DASHBOARD = mainContainer.createEl("div", { cls: "dn-flex" }); this._VIEW_NAVIGATOR = mainContainer.createEl("div", { cls: "dn-display-none" }); this._divSearchResults = this._VIEW_NAVIGATOR.createEl("div", { cls: "dn-div-table" }); this.dnShowModalSearchResults({ f: this._files_results, el: this._divSearchResults, leaf: this._leaf }); const divVaultStats = this._VIEW_DASHBOARD.createEl("div"); divVaultStats.setAttribute("id", "dn-vault-stats"); const divVaultGraph = this._VIEW_DASHBOARD.createEl("div"); divVaultGraph.setAttribute("id", "dn-vault-graph"); const divLastOpenedFiles = this._VIEW_DASHBOARD.createEl("div"); divLastOpenedFiles.setAttribute("id", "dn-last-opened-files"); const divRecentFiles = this._VIEW_DASHBOARD.createEl("div"); divRecentFiles.setAttribute("id", "dn-recent-files"); const divRecentNotes = this._VIEW_DASHBOARD.createEl("div"); divRecentNotes.setAttribute("id", "dn-recent-notes"); const divCanvas = this._VIEW_DASHBOARD.createEl("div"); divCanvas.setAttribute("id", "dn-canvas"); const divImages = this._VIEW_DASHBOARD.createEl("div"); divImages.setAttribute("id", "dn-images"); const divAudios = this._VIEW_DASHBOARD.createEl("div"); divAudios.setAttribute("id", "dn-audios"); const divVideos = this._VIEW_DASHBOARD.createEl("div"); divVideos.setAttribute("id", "dn-videos"); const divPDFs = this._VIEW_DASHBOARD.createEl("div"); divPDFs.setAttribute("id", "dn-pdfs"); const divOther = this._VIEW_DASHBOARD.createEl("div"); divOther.setAttribute("id", "dn-other"); await this.dnCreateBtn( divVaultStats, "dn-btn-notes", "Notes", this._notes, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-canvas", "Canvases", this._canvas, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-images", "Images", this._images, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-audios", "Audios", this._audios, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-videos", "Videos", this._videos, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-pdf", "PDFs", this._pdf, this._divSearchResults, this._leaf ); await this.dnCreateBtn( divVaultStats, "dn-btn-other", "Other", this._other, this._divSearchResults, this._leaf ); const canvasPieChart1 = divVaultGraph.createEl("canvas"); canvasPieChart1.setAttribute("id", "dashboard-canvas"); const styles = getComputedStyle(document.body); const labelColor = styles.getPropertyValue("--text-muted"); const pieChart1 = new DNPieChart(canvasPieChart1, 10, 12, 50, labelColor); pieChart1.addData(this._notes.length, this.color_notes, "Notes"); pieChart1.addData(this._images.length, this.color_images, "Images"); pieChart1.addData(this._canvas.length, this.color_canvas, "Canvas"); pieChart1.addData(this._videos.length, this.color_videos, "Videos"); pieChart1.addData(this._audios.length, this.color_audios, "Audios"); pieChart1.addData(this._pdf.length, this.color_pdf, "PDF"); pieChart1.addData(this._other.length, this.color_other, "Other"); pieChart1.draw(); const divStatsFrame = divVaultGraph.createEl("div", { cls: "dn-stats-files-folders" }); divStatsFrame.createEl("div", { cls: "dn-stats-files", text: "Files: " + this._files_excluded_filters.length }); divStatsFrame.createEl("div", { cls: "dn-stats-folders", text: "Folders: " + this._folders.length }); await this.dnCreateRecentFiles("Recently opened", divLastOpenedFiles, this._last_opened, this.num_recent_files); await this.dnCreateRecentFiles("Recent files", divRecentFiles, this._recent, this.num_recent_files); await this.dnCreateRecentFiles("Recent notes", divRecentNotes, this._notes, this.num_recent_files); await this.dnCreateRecentFiles("Recent canvases", divCanvas, this._canvas, this.num_recent_files); await this.dnCreateRecentFiles("Recent images", divImages, this._images, this.num_recent_files); await this.dnCreateRecentFiles("Recent audios", divAudios, this._audios, this.num_recent_files); await this.dnCreateRecentFiles("Recent videos", divVideos, this._videos, this.num_recent_files); await this.dnCreateRecentFiles("Recent PDFs", divPDFs, this._pdf, this.num_recent_files); await this.dnCreateRecentFiles("Recent other files", divOther, this._other, this.num_recent_files); } async dnCreateBtn(elDiv, btnId, btnTitle, btnCategoryFiles, displayEl, leaf) { const btn = elDiv.createEl("div", { cls: "dn-btn-stats" }); btn.setAttribute("id", btnId); btn.createEl("span", { cls: "dn-btn-stats-label", text: btnTitle }); btn.createEl("span", { cls: "dn-btn-stats-icon" }); btn.createEl("span", { cls: "dn-btn-stats-number", text: btnCategoryFiles.length.toString() }); btn.onClickEvent((evt) => { this._files_results = btnCategoryFiles; this._INPUT_SEARCH.value = "@" + btnTitle.toLocaleLowerCase() + " "; this.dnModalSearchVault(this._INPUT_SEARCH.value); this._INPUT_SEARCH.focus(); }); return btn; } dnCreateInputSearch(el) { const searchContainer = el.createEl("div", { cls: "dn-search-input-container" }); this._INPUT_SEARCH = searchContainer.createEl("input", { type: "search", placeholder: "Search..." }); this._INPUT_SEARCH.setAttribute("id", "dn-input-filter"); this._INPUT_SEARCH.spellcheck = false; this._INPUT_SEARCH.focus(); searchContainer.createEl("div", { cls: "search-input-clear-button" }).onClickEvent((evt) => { this._INPUT_SEARCH.value = ""; this._INPUT_SEARCH.focus(); this.dnModalSearchVault(this._INPUT_SEARCH.value); }); this._INPUT_SEARCH.addEventListener("input", (0, import_obsidian2.debounce)(() => this.dnModalSearchVault(this._INPUT_SEARCH.value), 300, true)); } async dnModalSearchVault(val) { this.dnSetView(2); const search_raw_vals = /!(?:"(?:\\"|[^"])*"|'(?:\\'|[^'])*')|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\S+/g; let searchParams = val.toLowerCase().trim().match(search_raw_vals); if (!searchParams) { return this.searchAction("", this._files_excluded_filters); } searchParams = searchParams.map((param) => { if (param.startsWith('"') && param.endsWith('"')) { return param.slice(1, -1); } else if (param.startsWith("'") && param.endsWith("'")) { return param.slice(1, -1); } else if (param.startsWith(".")) { return "\\" + param + "$"; } else if (param.startsWith("/") && param.length === 1) { return "^/$"; } else { return param; } }); const firstParam = searchParams[0]; await this.searchAction(firstParam, this._files_excluded_filters); const remainingParams = searchParams.slice(1); remainingParams.every(async (p) => { await this.searchAction(p, this._files_results); }); } // Search async searchAction(val, files) { let rExp; const isExcludeSearch = val.startsWith("!") && val.length >= 1; let excludeParam = isExcludeSearch ? val.slice(1) : val; if (excludeParam.startsWith('"') && excludeParam.endsWith('"')) { excludeParam = excludeParam.slice(1, -1); } else if (excludeParam.startsWith("'") && excludeParam.endsWith("'")) { excludeParam = excludeParam.slice(1, -1); } try { if (isExcludeSearch) { rExp = new RegExp("", "iu"); } else { if (val === "!") { rExp = new RegExp("", "iu"); } else { rExp = new RegExp(val.toLowerCase(), "iu"); } } } catch (error) { return; } const isDateSearch = val.startsWith("@"); if (this._INPUT_SEARCH.value.includes("@")) { this._INPUT_SEARCH.classList.add("dn-input-datesearch"); } else { this._INPUT_SEARCH.classList.remove("dn-input-datesearch"); } if (isExcludeSearch) { let isMatch; if (excludeParam === "/") { this._files_results = files.filter((file) => { isMatch = getFolderStructure(file.path).toLowerCase() === "/"; return isExcludeSearch ? !isMatch : isMatch; }); } else { this._files_results = files.filter((file) => { isMatch = file.name.toLowerCase().includes(excludeParam) || getFolderStructure(file.path).toLowerCase().includes(excludeParam) || (0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format).toLowerCase().includes(excludeParam) || getTagsPerFile(file).toLowerCase().includes(excludeParam) || getPropsPerFile(file).toLowerCase().includes(excludeParam); return isExcludeSearch ? !isMatch : isMatch; }); } } else { this._files_results = files.filter( (file) => { if (isDateSearch) { const dateSearch = val.slice(1).toLowerCase().split(" "); return this.dnHandleSpecialSearch(dateSearch[0], file); } else { return this.dnHandleNormalSearch(rExp, file); } } ); } this.dnSortFilteredFiles(false); await this.dnShowModalSearchResults({ f: this._files_results, el: this._divSearchResults, leaf: this._leaf }); const tbody = document.getElementById("dn-table-results"); if (tbody !== null) { const tr = tbody.getElementsByTagName("tr"); for (let i = 0, len = tr.length; i < len; i++) { const allTds = tr[i].querySelectorAll("td"); let isResult = false; for (let j = 0; j < allTds.length; j++) { const td = allTds[j]; const tdVal = td.innerText.toLowerCase(); if (rExp.test(tdVal) || isDateSearch) { isResult = true; break; } } if (isResult) { tr[i].classList.remove("dn-display-none"); } else { tr[i].classList.add("dn-display-none"); } } } } async dnShowModalSearchResults({ f, el, leaf, currentPage = 1 }) { el.empty(); const paginationContainer = this._divSearchResults.createEl("div", { cls: "dn-pagination" }); const table = el.createEl("table", { cls: this.selected_table_layout }); table.setAttribute("id", "dn-table"); const thead = table.createEl("thead"); const tr = thead.createEl("tr"); this._th1 = tr.createEl("th", { text: "Name" }); this._th2 = tr.createEl("th", { text: "Ext" }); this._th3 = tr.createEl("th", { text: "Path" }); this._th4 = tr.createEl("th", { text: "Size" }); this._th5 = tr.createEl("th", { text: "Date" }); this._th6 = tr.createEl("th", { text: "Tags" }); this._th7 = tr.createEl("th", { text: "Frontmatter" }); this._th1.addEventListener("dblclick", () => this.dnAlternateSortColumn("name")); this._th2.addEventListener("dblclick", () => this.dnAlternateSortColumn("ext")); this._th3.addEventListener("dblclick", () => this.dnAlternateSortColumn("path")); this._th4.addEventListener("dblclick", () => this.dnAlternateSortColumn("size")); this._th5.addEventListener("dblclick", () => this.dnAlternateSortColumn("modified")); const tbody = table.createEl("tbody"); tbody.setAttribute("id", "dn-table-results"); if (f.length > 0) { if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } this._total_pages = Math.ceil(f.length / this.files_per_page); const paginatedData = f.slice((currentPage - 1) * this.files_per_page, currentPage * this.files_per_page); paginatedData.forEach(async (file) => { const tr2 = tbody.createEl("tr"); tr2.addEventListener("contextmenu", (evt) => { this.dnHandleClick(evt, file); }); tr2.addEventListener("click", (evt) => { this.dnHandleClick(evt, file); }); tr2.addEventListener("dblclick", (evt) => { this.dnHandleDblClick(evt, file); }); tr2.addEventListener("mouseover", async (evt) => { this.dnHandleHoverPreview(evt, file); }); this.intersectionObserver.observe(tr2); tr2.removeEventListener("mouseover", async (evt) => { this.dnHandleHoverPreview(evt, file); }); const td1 = tr2.createEl("td"); td1.createEl("a", { cls: this.dnSetFileIconClass(file.extension), text: file.name }).onClickEvent((evt) => { if (leaf !== null && file !== null) { this.dnOpenFileAlt(file, evt); } }); const fExt = file.extension; const fSize = formatFileSize(file.stat.size); const fMTime = (0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format); const fCTime = (0, import_obsidian3.moment)(file.stat.ctime).format(this.date_format); const td2 = tr2.createEl("td"); td2.createEl("a", { cls: "dn-ext", text: fExt, title: fExt }).onClickEvent((evt) => { if (evt.button === 2) { evt.preventDefault(); } else { this._INPUT_SEARCH.value = "." + fExt; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); const td3 = tr2.createEl("td"); const folder_path = getFolderStructure(file.path); td3.createEl("a", { cls: "dn-folder-path", text: folder_path, title: file.path }).onClickEvent((evt) => { if (evt.button === 2) { evt.preventDefault(); } else { this._INPUT_SEARCH.value = folder_path; this.dnModalSearchVault(this._INPUT_SEARCH.value + "$"); } }); tr2.createEl("td", { text: fSize, title: fSize + " bytes" }); tr2.createEl("td", { text: fMTime, title: fCTime + " - Created\n" + fMTime + " - Modified" }); const tags_per_file = getTagsPerFile(file); const props_per_file = getPropsPerFile(file); const td6 = tr2.createEl("td", { title: tags_per_file }); if (tags_per_file !== "") { const fTags = tags_per_file.split(" "); fTags.forEach((tag) => { td6.createEl("a", { cls: "tag", text: tag, href: tag }).onClickEvent((evt) => { if (evt.button === 2) { evt.preventDefault(); } else { this._INPUT_SEARCH.value = tag; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); }); } const td7 = tr2.createEl("td"); if (props_per_file !== "") { const fProps = props_per_file.split("\n"); fProps.forEach((prop) => { td7.createEl("a", { cls: "dn-tag", text: prop, title: props_per_file }).onClickEvent((evt) => { if (evt.button === 2) { evt.preventDefault(); } else { this._INPUT_SEARCH.value = prop; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); }); } }); paginationContainer.empty(); paginationContainer.createEl("div", { cls: "dn-pagination-total-results", text: `File(s): ${f.length} ` }); const rightPagDiv = paginationContainer.createEl("div", { cls: "dn-pagination-current-page", text: `Page ${currentPage} of ${this._total_pages} ` }); const btnPrev = rightPagDiv.createEl("button", { cls: "dn-btn-prev", text: "\u25C0", title: "Previous" }); if (currentPage === 1) { btnPrev.disabled = true; } else { btnPrev.disabled = false; } btnPrev.addEventListener("click", () => { if (currentPage > 1) { this.dnShowModalSearchResults({ f, el, leaf, currentPage: currentPage - 1 }); } }); const btnNext = rightPagDiv.createEl("button", { cls: "dn-btn-next", text: "\u25B6", title: "Next" }); if (currentPage === this._total_pages) { btnNext.disabled = true; } else { btnNext.disabled = false; } btnNext.addEventListener("click", () => { if (currentPage < this._total_pages) { this.dnShowModalSearchResults({ f, el, leaf, currentPage: currentPage + 1 }); } }); this.dnUpdateSortIndicators( this._sort_column, this._sort_order, this._th1, this._th2, this._th3, this._th4, this._th5 ); const dnTableManager = new DNTableManager("#dn-table"); dnTableManager.hideColumns(this.hide_columns); } else { tr.empty(); paginationContainer.createEl("div", { cls: "dn-pagination-total-results", text: `File(s): 0 ` }); this._divSearchResults.createEl("p", { cls: "dn-no-results-found", text: "No files found." }); } } async dnSortFilteredFiles(toggle) { switch (this._sort_column) { case "name": case "path": case "ext": this.dnSortColumnString(this._sort_column, this._sort_order, toggle); break; case "size": case "modified": this.dnSortColumnNumber(this._sort_column, this._sort_order, toggle); break; } } dnSortColumnWithSelect() { const val = this._SELECT_SORT.value; if (this.dnIsValidSort(val)) { const selSort = val.split("-"); this._sort_column = selSort[0]; this._sort_order = selSort[1]; switch (this._sort_column) { case "name": case "path": case "ext": this.dnSortColumnString(this._sort_column, this._sort_order, false); break; case "size": case "modified": this.dnSortColumnNumber(this._sort_column, this._sort_order, false); break; } this.dnShowModalSearchResults({ f: this._files_results, el: this._divSearchResults, leaf: this._leaf }); } } dnIsValidSort(val) { if ([ "name-asc", "name-desc", "path-asc", "path-desc", "ext-asc", "ext-desc", "size-asc", "size-desc", "modified-asc", "modified-desc" ].includes(val)) { return true; } else { return false; } } dnIsValidLayout(val) { if (this._TABLE_LAYOUTS.includes(val)) { return true; } else { return false; } } dnAlternateSortColumn(colName) { switch (colName) { case "name": this.dnSortColumnString("name", this._sort_order, true); break; case "path": this.dnSortColumnString("path", this._sort_order, true); break; case "ext": this.dnSortColumnString("ext", this._sort_order, true); break; case "size": this.dnSortColumnNumber("size", this._sort_order, true); break; case "modified": this.dnSortColumnNumber("modified", this._sort_order, true); break; } this.dnShowModalSearchResults({ f: this._files_results, el: this._divSearchResults, leaf: this._leaf }); } dnUpdateSortIndicators(activeColumn, sortOrder, col1, col2, col3, col4, col5) { col1.classList.remove("sort-active", "sort-asc", "sort-desc"); col2.classList.remove("sort-active", "sort-asc", "sort-desc"); col3.classList.remove("sort-active", "sort-asc", "sort-desc"); col4.classList.remove("sort-active", "sort-asc", "sort-desc"); col5.classList.remove("sort-active", "sort-asc", "sort-desc"); let activeThCell = col5; switch (activeColumn) { case "name": activeThCell = col1; break; case "ext": activeThCell = col2; break; case "path": activeThCell = col3; break; case "size": activeThCell = col4; break; case "modified": activeThCell = col5; break; } activeThCell.classList.add("sort-active"); activeThCell.classList.add(sortOrder === "asc" ? "sort-asc" : "sort-desc"); } dnSortColumnString(sortColumn, sortOrder, toggleSortOrder) { const supportedColumns = ["name", "path", "ext"]; if (!supportedColumns.includes(sortColumn)) { return; } if (toggleSortOrder) { if (this._sort_column === sortColumn) { sortOrder = sortOrder === "asc" ? "desc" : "asc"; } else { this._sort_column = sortColumn; sortOrder = "desc"; } this._sort_order = sortOrder; } const sortValue = sortColumn + "-" + this._sort_order; this.dnSetSelectSortValue(sortValue); this._files_results.sort((fileA, fileB) => { let sortA; let sortB; let folderStructureA; let folderStructureB; switch (sortColumn) { case "name": sortA = fileA.name.toLowerCase(); sortB = fileB.name.toLowerCase(); break; case "ext": sortA = fileA.extension.toLowerCase(); sortB = fileB.extension.toLowerCase(); break; case "path": folderStructureA = getFolderStructure(fileA.path); folderStructureB = getFolderStructure(fileB.path); sortA = folderStructureA.toLowerCase(); sortB = folderStructureB.toLowerCase(); break; default: sortA = fileA.name.toLowerCase(); sortB = fileB.name.toLowerCase(); } if (sortOrder === "asc") { return sortA.localeCompare(sortB); } else if (sortOrder === "desc") { return sortB.localeCompare(sortA); } else { return sortA.localeCompare(sortB); } }); } dnSortColumnNumber(sortColumn, sortOrder, toggleSortOrder) { const supportedColumns = ["size", "modified"]; if (!supportedColumns.includes(sortColumn)) { return; } if (toggleSortOrder) { if (this._sort_column === sortColumn) { sortOrder = sortOrder === "asc" ? "desc" : "asc"; } else { this._sort_column = sortColumn; sortOrder = "desc"; } this._sort_order = sortOrder; } const sortValue = sortColumn + "-" + this._sort_order; this.dnSetSelectSortValue(sortValue); this._files_results.sort((fileA, fileB) => { let sortA = 0; let sortB = 0; switch (sortColumn) { case "size": sortA = fileA.stat.size; sortB = fileB.stat.size; break; case "modified": sortA = fileA.stat.mtime; sortB = fileB.stat.mtime; break; } if (sortOrder === "asc") { return sortA - sortB; } else if (sortOrder === "desc") { return sortB - sortA; } else { return sortA - sortB; } }); } async dnGetRecentFiles(files) { const arrRecentFiles = files; return arrRecentFiles.sort((a, b) => b.stat.mtime - a.stat.mtime).slice(0, this.num_recent_files); } async dnCreateRecentFiles(title, divF, files, num_files) { if (files.length === 0) { divF.createEl("h3", { cls: "dn-subtitles", text: title }); divF.createEl("p", { cls: "dn-no-results-found", text: "No files found." }); divF.classList.add("dn-display-none"); } else { divF.createEl("h3", { cls: "dn-subtitles", text: title }); let sortedFiles = []; if (title === "Recently opened") { sortedFiles = files.slice(0, this.num_recent_files); } else { sortedFiles = await this.dnGetRecentFiles(files); } sortedFiles.forEach((sfile) => { const aLink = divF.createEl("a", { cls: this.dnSetFileIconClass(sfile.extension), text: sfile.basename, title: sfile.path }); aLink.onClickEvent((evt) => { if (sfile !== null) { this.dnOpenFileAlt(sfile, evt); } }); if (sfile.extension !== "md") { divF.createEl("span", { cls: "nav-file-tag", text: sfile.extension }); } divF.createEl("br"); aLink.addEventListener("mouseover", (evt) => this.dnHandleHoverPreview(evt, sfile)); }); } } async dnOrganizeFiles({ arr }) { const arrNotes = []; const arrImages = []; const arrAudios = []; const arrCanvas = []; const arrVideos = []; const arrPDFs = []; const arrOther = []; const extensions = { "md": arrNotes, // Images "avif": arrImages, "bmp": arrImages, "gif": arrImages, "ico": arrImages, "jpeg": arrImages, "jpg": arrImages, "png": arrImages, "raw": arrImages, "svg": arrImages, "tif": arrImages, "tiff": arrImages, "webp": arrImages, // Audios "aac": arrAudios, "aif": arrAudios, "aifc": arrAudios, "aiff": arrAudios, "flac": arrAudios, "m4a": arrAudios, "mp3": arrAudios, "ogg": arrAudios, "wav": arrAudios, "webm": arrAudios, // Videos "avi": arrVideos, "mov": arrVideos, "mkv": arrVideos, "mp4": arrVideos, // PDF and other formats "pdf": arrPDFs, "canvas": arrCanvas }; for (let i = 0, len = arr.length; i < len; i++) { const f = arr[i].extension.toLowerCase(); const targetArr = extensions[f]; if (targetArr) { targetArr.push(arr[i]); } else { arrOther.push(arr[i]); } } this._notes = arrNotes; this._images = arrImages; this._audios = arrAudios; this._videos = arrVideos; this._pdf = arrPDFs; this._canvas = arrCanvas; this._other = arrOther; } dnSetFileIconClass(ext) { const file_extension = ext.toLowerCase(); const extensions = { "md": "note", // Images "avif": "image", "bmp": "image", "gif": "image", "ico": "image", "jpeg": "image", "jpg": "image", "png": "image", "raw": "image", "svg": "image", "tif": "image", "tiff": "image", "webp": "image", // Audios "aac": "audio", "aif": "audio", "aifc": "audio", "aiff": "audio", "flac": "audio", "m4a": "audio", "mp3": "audio", "ogg": "audio", "wav": "audio", "webm": "audio", // Videos "avi": "video", "mov": "video", "mkv": "video", "mp4": "video", // PDF and other formats "pdf": "pdf", "canvas": "canvas" }; if (file_extension in extensions) { return "dn-f-" + extensions[file_extension]; } else { return "dn-f-other"; } } // Custom Colors dnSetCustomColors() { document.body.style.setProperty("--dn-notes-color", this.color_notes); document.body.style.setProperty("--dn-images-color", this.color_images); document.body.style.setProperty("--dn-canvas-color", this.color_canvas); document.body.style.setProperty("--dn-videos-color", this.color_videos); document.body.style.setProperty("--dn-audios-color", this.color_audios); document.body.style.setProperty("--dn-pdfs-color", this.color_pdf); document.body.style.setProperty("--dn-other-color", this.color_other); } dnToggleColoredFiles() { const dnMainContainer = document.getElementById("dn-container"); if (this.colored_files) { dnMainContainer == null ? void 0 : dnMainContainer.classList.add("dn-colored-files"); } else { dnMainContainer == null ? void 0 : dnMainContainer.classList.remove("dn-colored-files"); } this.dnSetCustomColors(); } dnSetView(view) { const divElements = [this._VIEW_DASHBOARD, this._VIEW_NAVIGATOR]; const topNavBtns = [this._BTN_DASHBOARD, this._BTN_NAVIGATOR]; divElements.forEach((el) => { el.classList.add("dn-display-none"); el.classList.remove("dn-flex"); }); topNavBtns.forEach((btn) => btn.classList.remove("mod-cta")); switch (view) { case 1: this._VIEW_DASHBOARD.classList.remove("dn-display-none"); this._VIEW_DASHBOARD.classList.add("dn-flex"); this._BTN_DASHBOARD.classList.add("mod-cta"); this.dnHideTopRightNav(); break; case 2: this._VIEW_NAVIGATOR.classList.remove("dn-display-none"); this._VIEW_NAVIGATOR.classList.add("dn-flex"); this._BTN_NAVIGATOR.classList.add("mod-cta"); this.dnShowTopRightNav(); break; default: this._VIEW_DASHBOARD.classList.remove("dn-display-none"); this._VIEW_DASHBOARD.classList.add("dn-flex"); this._BTN_DASHBOARD.classList.add("mod-cta"); this.dnHideTopRightNav(); } } dnShowTopRightNav() { this._SELECT_SORT.classList.remove("dn-display-none"); this._SELECT_TABLE_LAYOUT.classList.remove("dn-display-none"); this.labelLayout.classList.remove("dn-display-none"); this.labelSort.classList.remove("dn-display-none"); } dnHideTopRightNav() { this._SELECT_SORT.classList.add("dn-display-none"); this._SELECT_TABLE_LAYOUT.classList.add("dn-display-none"); this.labelLayout.classList.add("dn-display-none"); this.labelSort.classList.add("dn-display-none"); } dnSetSelectSortValue(val) { if (this.dnIsValidSort(val)) { this.selected_sort_value = val; this._SELECT_SORT.value = this.selected_sort_value; } } dnSetSelectLayoutValue(val) { if (this.dnIsValidLayout(val)) { this._SELECT_TABLE_LAYOUT.value = val; this.dnSelectTableLayout(); } } dnSelectTableLayout() { const val = this._SELECT_TABLE_LAYOUT.value; if (this._TABLE_LAYOUTS.includes(val)) { const tbl = document.getElementById("dn-table"); this._TABLE_LAYOUTS.forEach((layout) => tbl == null ? void 0 : tbl.classList.remove(layout)); tbl == null ? void 0 : tbl.classList.add(val); this.selected_table_layout = val; } } dnSelectTableRow(evt) { if (!evt || typeof evt !== "object") { return; } if (evt.target instanceof HTMLTableCellElement) { const allTr = document.querySelectorAll("#dn-table tr"); allTr.forEach((row) => row.classList.remove("tbl-selected")); const clickedTr = evt.target.parentElement; clickedTr.classList.add("tbl-selected"); } } dnGenerateContextMenu(evt, file) { this._DN_CTX_MENU = new import_obsidian2.Menu(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open").setIcon("mouse-pointer-2").onClick(() => { this.app.workspace.getLeaf(false).openFile(file); this.close(); }) ); this._DN_CTX_MENU.addSeparator(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open in new tab").setIcon("file-plus").onClick(() => { this.app.workspace.getLeaf("tab").openFile(file); this.close(); }) ); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open to the right").setIcon("separator-vertical").onClick(() => { this.app.workspace.getLeaf("split").openFile(file); this.close(); }) ); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open in new window").setIcon("picture-in-picture-2").onClick(() => { this.app.workspace.getLeaf("window").openFile(file); }) ); this._DN_CTX_MENU.addSeparator(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Show preview").setIcon("eye").onClick((evt2) => { this.dnShowPreviewFile(evt2, file); }) ); this._DN_CTX_MENU.addSeparator(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Frontmatter").setIcon("text").onClick(() => { const fpModal = new import_obsidian2.Modal(this.app); fpModal.contentEl.setAttribute("class", "dn-frontmatter-modal"); fpModal.contentEl.createEl("h4", { text: "Frontmatter" }); const rowName = fpModal.contentEl.createEl("div", { cls: "dn-property-row" }); rowName.createEl("div", { text: "Name: ", cls: "dn-property-name-sm" }); rowName.createEl("div", { text: file.name, cls: "dn-property-value" }); const rowPath = fpModal.contentEl.createEl("div", { cls: "dn-property-row" }); rowPath.createEl("div", { text: "Path: ", cls: "dn-property-name-sm" }); rowPath.createEl("div", { text: getFolderStructure(file.path), cls: "dn-property-value" }); fpModal.contentEl.createEl("br"); fpModal.contentEl.createEl("span", { text: "Frontmatter: ", cls: "dn-properties" }); fpModal.contentEl.createEl("br"); const frontmatterDiv = fpModal.contentEl.createEl("div", { cls: "dn-properties-frontmatter-modal" }); frontmatterDiv.setAttribute("contenteditable", "true"); frontmatterDiv.setAttribute("spellcheck", "false"); const curProps = getPropsPerFile(file); if (curProps) { const prop = curProps.split(" \n"); for (let i = 0, len = prop.length; i < len; i++) { frontmatterDiv.createEl("a", { text: prop[i], cls: "dn-fproperties" }).onClickEvent((evt2) => { if (evt2.button === 2) { evt2.preventDefault(); } else { fpModal.close(); this._INPUT_SEARCH.value = prop[i]; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); frontmatterDiv.createEl("br"); } } else { frontmatterDiv.createEl("span", { text: "No frontmatter" }); } fpModal.contentEl.createEl("br"); const divBottom = fpModal.contentEl.createEl("div", { cls: "dn-div-bottom-properties" }); const btnPropsOpen = divBottom.createEl("button", { text: "Open", cls: "dn-btn-properties-open-file" }); btnPropsOpen.onClickEvent(() => { fpModal.close(); this.dnOpenFile(file); }); const btnCloseProps = divBottom.createEl("button", { text: "Close", cls: "dn-btn-properties-close" }); btnCloseProps.onClickEvent(() => { fpModal.close(); }); fpModal.open(); frontmatterDiv.blur(); }) ); this._DN_CTX_MENU.addItem( (item) => item.setTitle("File properties").setIcon("file-cog").onClick(() => { const mdFileProps = new import_obsidian2.Modal(this.app); mdFileProps.contentEl.setAttribute("class", "dn-properties-modal"); mdFileProps.contentEl.createEl("h4", { text: "File properties" }); const rowName = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowName.createEl("div", { text: "Name: ", cls: "dn-property-name" }); rowName.createEl("div", { text: file.name, cls: "dn-property-value" }); const rowExt = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowExt.createEl("div", { text: "Extension: ", cls: "dn-property-name" }); const rowExtValue = rowExt.createEl("div", { cls: "dn-property-value" }); rowExtValue.createEl("span", { text: file.extension, cls: "nav-file-tag" }); const rowPath = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowPath.createEl("div", { text: "Path: ", cls: "dn-property-name" }); rowPath.createEl("div", { text: getFolderStructure(file.path), cls: "dn-property-value" }); mdFileProps.contentEl.createEl("br"); const rowSize = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowSize.createEl("div", { text: "Size: ", cls: "dn-property-name" }); rowSize.createEl("div", { text: formatFileSize(file.stat.size) + " bytes" + formatFileSizeKBMB(file.stat.size) }); mdFileProps.contentEl.createEl("br"); const rowDateCreated = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowDateCreated.createEl("div", { text: "Created: ", cls: "dn-property-name" }); rowDateCreated.createEl("div", { text: (0, import_obsidian3.moment)(file.stat.ctime).format(this.date_format) }); const rowDateModified = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowDateModified.createEl("div", { text: "Modified: ", cls: "dn-property-name" }); rowDateModified.createEl("div", { text: (0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format) }); mdFileProps.contentEl.createEl("br"); const rowTags = mdFileProps.contentEl.createEl("div", { cls: "dn-property-row" }); rowTags.createEl("div", { text: "Tag(s): ", cls: "dn-property-name" }); const propTags = rowTags.createEl("div"); const curTags = getTagsPerFile(file); if (curTags !== "") { const tags = curTags.split(" "); for (let i = 0, len = tags.length; i < len; i++) { propTags.createEl("a", { text: tags[i], href: tags[i], cls: "tag" }).onClickEvent((evt2) => { if (evt2.button === 2) { evt2.preventDefault(); } else { mdFileProps.close(); this._INPUT_SEARCH.value = tags[i]; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); } } else { propTags.createEl("span", { text: "No tags" }); } mdFileProps.contentEl.createEl("br"); mdFileProps.contentEl.createEl("span", { text: "Frontmatter: ", cls: "dn-properties" }); mdFileProps.contentEl.createEl("br"); const frontmatterProps = mdFileProps.contentEl.createEl("div", { cls: "dn-properties-frontmatter" }); frontmatterProps.setAttribute("contenteditable", "true"); frontmatterProps.setAttribute("spellcheck", "false"); const curProps = getPropsPerFile(file); if (curProps) { const prop = curProps.split(" \n"); for (let i = 0, len = prop.length; i < len; i++) { frontmatterProps.createEl("a", { text: prop[i], cls: "dn-fproperties" }).onClickEvent((evt2) => { if (evt2.button === 2) { evt2.preventDefault(); } else { mdFileProps.close(); this._INPUT_SEARCH.value = prop[i]; this.dnModalSearchVault(this._INPUT_SEARCH.value); } }); frontmatterProps.createEl("br"); } } else { frontmatterProps.createEl("span", { text: "No frontmatter" }); } mdFileProps.contentEl.createEl("br"); const divBottom = mdFileProps.contentEl.createEl("div", { cls: "dn-div-bottom-properties" }); const btnPropsOpen = divBottom.createEl("button", { text: "Open", cls: "dn-btn-properties-open-file" }); btnPropsOpen.onClickEvent(() => { mdFileProps.close(); this.dnOpenFile(file); }); const btnCloseProps = divBottom.createEl("button", { text: "Close", cls: "dn-btn-properties-close" }); btnCloseProps.onClickEvent(() => { mdFileProps.close(); }); mdFileProps.open(); frontmatterProps.blur(); }) ); this._DN_CTX_MENU.showAtMouseEvent(evt); } dnHandleClick(evt, file) { if (!evt || typeof evt !== "object" || !(file instanceof import_obsidian2.TFile)) { return; } this.dnSelectTableRow(evt); if (evt.button === 2) { evt.preventDefault(); this.dnGenerateContextMenu(evt, file); } } dnHandleDblClick(evt, file) { if (!evt || typeof evt !== "object" || !(file instanceof import_obsidian2.TFile)) { return; } evt.preventDefault(); this.dnSelectTableRow(evt); this.dnOpenFile(file); } dnHandleHoverPreview(evt, file) { evt.stopImmediatePropagation(); if (evt.ctrlKey || evt.metaKey) { this.dnShowPreviewFile(evt, file); } } dnShowPreviewFile(evt, file) { this._hoverDiv.empty(); const topBar = this._hoverDiv.createEl("div", { cls: "dn-preview-top-bar" }); const btnClosePreview = topBar.createEl("div", { cls: "modal-close-button" }); btnClosePreview.onClickEvent((evt2) => { evt2.stopPropagation(); this.dnHidePreview(); }); const previewTop = topBar.createEl("div", "dn-preview-titlebar"); const divPreviewName = previewTop.createEl("div", { cls: "dn-property-row" }); divPreviewName.createEl("div", { text: "Name: ", cls: "dn-property-name-sm" }); divPreviewName.createEl("div", { text: file.name, cls: "dn-property-value" }); const divPreviewPath = previewTop.createEl("div", { cls: "dn-property-row" }); divPreviewPath.createEl("div", { text: "Path: ", cls: "dn-property-name-sm" }); divPreviewPath.createEl("div", { text: getFolderStructure(file.path), cls: "dn-property-value" }); const divButtons = topBar.createEl("div", { cls: "dn-div-top-preview-btns" }); const btnPreviewOpenFile = divButtons.createEl("button", { text: "Open", cls: "dn-btn-properties-open-file" }); btnPreviewOpenFile.onClickEvent(() => { this.dnHidePreview(); this.close(); this.dnOpenFile(file); }); const btnPreviewOpenFileNewTab = divButtons.createEl("button", { text: "Open in new tab", cls: "dn-btn-properties-open-file" }); btnPreviewOpenFileNewTab.onClickEvent(() => { this.dnHidePreview(); this.close(); this.app.workspace.getLeaf("tab").openFile(file); }); const btnPreviewOpenFileNewWindow = divButtons.createEl("button", { text: "Open in new window", cls: "dn-btn-properties-open-file" }); btnPreviewOpenFileNewWindow.onClickEvent(() => { this.dnHidePreview(); this.app.workspace.getLeaf("window").openFile(file); }); this._hoverRender = this._hoverDiv.createEl("div", { cls: "dn-pr-content" }); try { import_obsidian2.MarkdownRenderer.render( this.app, "![[" + (0, import_obsidian2.normalizePath)(file.path) + "]]", this._hoverRender, (0, import_obsidian2.normalizePath)(file.path), this._previewComponent ); } catch (error) { return; } this._hoverDiv.style.display = "block"; previewTop.addEventListener("mousedown", (evt2) => this.dnHoverDragOnMouseDown(evt2)); this._hoverDiv.addEventListener("mousemove", (evt2) => this.dnHoverDragOnMouseMove(evt2)); this._hoverDiv.addEventListener("mouseup", (evt2) => this.dnHoverDragOnMouseUp(evt2)); const screenWidth = window.innerWidth; const screenHeight = window.innerHeight; const divW = this._hoverDiv.offsetWidth; const divH = this._hoverDiv.offsetHeight; if (this._hoverDivLeft === "") { this._hoverDiv.style.left = ((screenWidth - divW) / 2).toString() + "px"; this._hoverDiv.style.top = ((screenHeight - divH) / 2).toString() + "px"; } previewTop.removeEventListener("mousedown", (evt2) => this.dnHoverDragOnMouseDown(evt2)); } dnHidePreview() { this._isDraggingPreview = false; this._hoverDiv.style.display = "none"; this._hoverDiv.empty(); } dnHandleNormalSearch(rExp, file) { return rExp.test(file.name.toLowerCase()) || rExp.test(getFolderStructure(file.path).toLowerCase()) || rExp.test((0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format)) || rExp.test(getTagsPerFile(file).toLowerCase()) || rExp.test(getPropsPerFile(file).toLowerCase()); } dnHandleSpecialSearch(search, file) { const mtime = (0, import_obsidian3.moment)(file.stat.mtime); switch (search) { case "d": case "day": case "today": return mtime.isSame((0, import_obsidian3.moment)(), "day"); case "d-1": case "day-1": case "yesterday": return mtime.isBetween((0, import_obsidian3.moment)().subtract(1, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-2": case "day-2": return mtime.isBetween((0, import_obsidian3.moment)().subtract(2, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-3": case "day-3": return mtime.isBetween((0, import_obsidian3.moment)().subtract(3, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-4": case "day-4": return mtime.isBetween((0, import_obsidian3.moment)().subtract(4, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-5": case "day-5": return mtime.isBetween((0, import_obsidian3.moment)().subtract(5, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-6": case "day-6": return mtime.isBetween((0, import_obsidian3.moment)().subtract(6, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "d-7": case "day-7": case "w": case "week": return mtime.isBetween((0, import_obsidian3.moment)().subtract(7, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "m": case "month": return mtime.isSame((0, import_obsidian3.moment)(), "month"); case "m-1": case "month-1": return mtime.isBetween((0, import_obsidian3.moment)().subtract(1, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-2": case "month-2": return mtime.isBetween((0, import_obsidian3.moment)().subtract(2, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-3": case "month-3": return mtime.isBetween((0, import_obsidian3.moment)().subtract(3, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-4": case "month-4": return mtime.isBetween((0, import_obsidian3.moment)().subtract(4, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-5": case "month-5": return mtime.isBetween((0, import_obsidian3.moment)().subtract(5, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-6": case "month-6": return mtime.isBetween((0, import_obsidian3.moment)().subtract(6, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-7": case "month-7": return mtime.isBetween((0, import_obsidian3.moment)().subtract(7, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-8": case "month-8": return mtime.isBetween((0, import_obsidian3.moment)().subtract(8, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-9": case "month-9": return mtime.isBetween((0, import_obsidian3.moment)().subtract(9, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-10": case "month-10": return mtime.isBetween((0, import_obsidian3.moment)().subtract(10, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-11": case "month-11": return mtime.isBetween((0, import_obsidian3.moment)().subtract(11, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "m-12": case "month-12": return mtime.isBetween((0, import_obsidian3.moment)().subtract(12, "month"), (0, import_obsidian3.moment)(), "month", "[]"); case "y": case "year": return mtime.isSame((0, import_obsidian3.moment)(), "year"); case "n": case "notes": return this._notes.includes(file); case "c": case "canvases": case "canvas": return this._canvas.includes(file); case "i": case "images": return this._images.includes(file); case "a": case "audios": return this._audios.includes(file); case "v": case "videos": return this._videos.includes(file); case "p": case "pdf": case "pdfs": return this._pdf.includes(file); case "o": case "other": case "others": return this._other.includes(file); default: return false; } } dnOpenFileAlt(f, evt) { if (!evt || typeof evt !== "object" || !(f instanceof import_obsidian2.TFile)) { return; } try { if (evt.button === 0 && (evt.ctrlKey || evt.metaKey)) { this.app.workspace.getLeaf("tab").openFile(f); } else if (evt.button === 1) { this.app.workspace.getLeaf("tab").openFile(f); } else if (evt.button === 0) { this.dnOpenFile(f); } else if (evt.button === 2 && !(evt.target instanceof HTMLTableCellElement)) { evt.preventDefault(); this.dnGenerateContextMenu(evt, f); } } catch (er) { return; } } dnOpenFile(file) { this.app.workspace.getLeaf(false).openFile(file); this.close(); } dnHoverDragOnMouseDown(evt) { evt.stopPropagation(); this._isDraggingPreview = true; this.initialX = evt.screenX - this._hoverDiv.offsetLeft; this.initialY = evt.screenY - this._hoverDiv.offsetTop; this.previousX = evt.screenX; this.previousY = evt.screenY; } dnHoverDragOnMouseMove(evt) { evt.stopPropagation(); if (this._isDraggingPreview) { const newX = evt.screenX - this.initialX; const newY = evt.screenY - this.initialY; if (Math.abs(evt.screenX - this.previousX) > 5 || Math.abs(evt.screenY - this.previousY) > 5) { this._hoverDiv.style.left = newX + "px"; this._hoverDiv.style.top = newY + "px"; this.previousX = evt.screenX; this.previousY = evt.screenY; } this._hoverDivLeft = newX + "px"; this._hoverDivTop = newY + "px"; } } dnHoverDragOnMouseUp(evt) { evt.stopPropagation(); this._isDraggingPreview = false; } onClose() { const { contentEl } = this; contentEl.empty(); this._previewComponent.unload(); if (this._INPUT_SEARCH && this._INPUT_SEARCH.removeEventListener) { this._INPUT_SEARCH.removeEventListener("input", (0, import_obsidian2.debounce)(() => this.dnModalSearchVault(this._INPUT_SEARCH.value), 300, true)); } this._th1.removeEventListener("dblclick", () => this.dnAlternateSortColumn("name")); this._th2.removeEventListener("dblclick", () => this.dnAlternateSortColumn("ext")); this._th3.removeEventListener("dblclick", () => this.dnAlternateSortColumn("path")); this._th4.removeEventListener("dblclick", () => this.dnAlternateSortColumn("size")); this._th5.removeEventListener("dblclick", () => this.dnAlternateSortColumn("modified")); this._SELECT_SORT.removeEventListener("change", () => { this.dnSortColumnWithSelect(); }); this._hoverDiv.removeEventListener("mousemove", (evt) => this.dnHoverDragOnMouseMove(evt)); this._hoverDiv.removeEventListener("mouseup", (evt) => this.dnHoverDragOnMouseUp(evt)); if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } } }; // src/main.ts var DEFAULT_SETTINGS = { default_view: 1, font_size: 16, selected_table_layout: "dn-tbl-default", date_format: "YYYY-MM-DD HH:mm", files_per_page: 20, num_recent_files: 5, excluded_ext: "", excluded_path: "", color_notes: "#bf48ff", color_images: "#007fff", color_canvas: "#ff7f28", color_videos: "#d34848", color_audios: "#bfbf00", color_pdf: "#00a300", color_other: "#828282", colored_files: false, hide_ext: false, hide_path: false, hide_size: false, hide_date: false, hide_tags: false, hide_frontmatter: false, hide_columns: [] }; var DNPlugin = class extends import_obsidian4.Plugin { async onload() { await this.loadSettings(); this.DN_MODAL = new DNModal(this.app); this.DN_MODAL.default_view = this.settings.default_view; this.DN_MODAL.date_format = this.settings.date_format; this.DN_MODAL.num_recent_files = this.settings.num_recent_files; this.DN_MODAL.files_per_page = this.settings.files_per_page; this.DN_MODAL.selected_table_layout = this.settings.selected_table_layout; this.DN_MODAL.excluded_extensions = this.dnGetExcludedExtensions(this.settings.excluded_ext); this.DN_MODAL.excluded_folders = this.dnGetExcludedFolders(this.settings.excluded_path); this.dnSetFontSize(this.settings.font_size); this.DN_MODAL.colored_files = this.settings.colored_files; this.DN_MODAL.color_notes = this.settings.color_notes; this.DN_MODAL.color_canvas = this.settings.color_canvas; this.DN_MODAL.color_images = this.settings.color_images; this.DN_MODAL.color_videos = this.settings.color_videos; this.DN_MODAL.color_audios = this.settings.color_audios; this.DN_MODAL.color_pdf = this.settings.color_pdf; this.DN_MODAL.color_other = this.settings.color_other; this.DN_MODAL.hide_columns = this.dnSetHiddenColumns(this.settings.hide_columns); this.addRibbonIcon("gauge", "Open dashboard navigator", (evt) => { this.DN_MODAL.default_view = this.settings.default_view; this.DN_MODAL.open(); }); this.addCommand({ id: "dashboard", name: "Open dashboard", callback: () => { this.DN_MODAL.default_view = 1; this.DN_MODAL.open(); } }); this.addCommand({ id: "navigator", name: "Open navigator", callback: () => { this.DN_MODAL.default_view = 2; this.DN_MODAL.open(); } }); this.addSettingTab(new DNSettingTab(this.app, this)); } dnSetFontSize(val) { if (val >= 12 || val <= 24) { document.body.style.setProperty("--dn-font-size", val.toString() + "px"); } } dnSetHiddenColumns(arrCols) { const allowedCols = ["ext", "path", "size", "date", "tags", "frontmatter"]; arrCols = arrCols.filter((col) => allowedCols.includes(col)); if (arrCols.length <= 6 && arrCols.some((col) => ["ext", "path", "size", "date", "tags", "frontmatter"].includes(col))) { return arrCols; } else { this.settings.hide_columns = []; this.settings.hide_ext = false; this.settings.hide_path = false; this.settings.hide_size = false; this.settings.hide_date = false; this.settings.hide_tags = false; this.settings.hide_frontmatter = false; this.saveSettings(); return []; } } dnUpdateHideColumn(col, val) { const allowedCols = ["ext", "path", "size", "date", "tags", "frontmatter"]; if (allowedCols.includes(col) && val === true) { if (!this.settings.hide_columns.includes(col)) { this.settings.hide_columns.push(col); this.DN_MODAL.hide_columns = this.settings.hide_columns; } } else { this.settings.hide_columns = this.settings.hide_columns.filter((c) => c !== col); this.DN_MODAL.hide_columns = this.settings.hide_columns; } } dnGetExcludedFolders(foldersString) { if (foldersString === "") { return []; } const folders = foldersString.split(",").map((folder) => folder.trim()); return folders.map((folder) => folder.replace(/^\/|\/$|\.\./g, "")).filter((folder) => folder !== ""); } dnGetExcludedExtensions(excluded_ext) { if (excluded_ext === "") { return []; } return excluded_ext.split(",").map((extension) => extension.trim()); } onunload() { } async loadSettings() { this.settings = Object.assign( {}, DEFAULT_SETTINGS, await this.loadData() ); } async saveSettings() { await this.saveData(this.settings); } }; /* nosourcemap */