From aae9d6c3948807f4aa6c8ffbfd92f56c33b7ab1d Mon Sep 17 00:00:00 2001 From: DecafDev <40307803+decaf-dev@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:04:44 -0600 Subject: [PATCH] Add table view (#293) * chore: bump version * feat: add basic table view * feat: format time data as a time string * feat: add basePath * refactor: remove unused handlers * feat: add context menu to table * feat: add title support * feat: remove slash from path * feat: handle custom rendering of elements * feat: handle row click * feat: add min width to columns * feat: add hover over * feat: add file icons * feat: enable table setting --- manifest.json | 2 +- package.json | 2 +- src/constants.ts | 7 +- src/migrations/index.ts | 6 + src/migrations/migrate_1_38_0.ts | 3 +- src/migrations/migrate_1_39_0.ts | 26 ++ src/obsidian/vault-explorer-settings-tab.ts | 2 - src/obsidian/vault-explorer-view.ts | 1 + src/svelte/app/components/feed-card.svelte | 18 +- src/svelte/app/components/grid-card.svelte | 8 - src/svelte/app/components/list-item.svelte | 12 - src/svelte/app/components/table-view.svelte | 278 +++++++++++++++ src/svelte/app/index.svelte | 8 + src/svelte/app/services/render-data.ts | 6 +- src/svelte/app/types.ts | 1 + src/types/types-1.38.0.ts | 327 ++++++++++++++++++ .../plugins/vault-explorer/data.json | 7 +- versions.json | 3 +- 18 files changed, 671 insertions(+), 46 deletions(-) create mode 100644 src/migrations/migrate_1_39_0.ts create mode 100644 src/svelte/app/components/table-view.svelte create mode 100644 src/types/types-1.38.0.ts diff --git a/manifest.json b/manifest.json index 5e31bb8..b1cb2b6 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "vault-explorer", "name": "Vault Explorer", - "version": "1.38.0", + "version": "1.39.0", "minAppVersion": "1.4.13", "description": "Explore your vault in visual format", "author": "DecafDev", diff --git a/package.json b/package.json index 542419a..f2085eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-vault-explorer", - "version": "1.38.0", + "version": "1.39.0", "description": "Explore your vault in visual format", "main": "main.js", "scripts": { diff --git a/src/constants.ts b/src/constants.ts index eb22d7c..28eb9f2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -95,7 +95,12 @@ export const DEFAULT_SETTINGS: VaultExplorerPluginSettings = { filterGroupsWidth: "300px", shouldWrapFilterGroups: false, pageSize: 25, - viewOrder: [TExplorerView.GRID, TExplorerView.LIST, TExplorerView.FEED], + viewOrder: [ + TExplorerView.GRID, + TExplorerView.LIST, + TExplorerView.TABLE, + TExplorerView.FEED, + ], configDir: ".vaultexplorer", pluginVersion: null, logLevel: LOG_LEVEL_WARN, diff --git a/src/migrations/index.ts b/src/migrations/index.ts index 515b6d9..1ee1161 100644 --- a/src/migrations/index.ts +++ b/src/migrations/index.ts @@ -28,6 +28,7 @@ import Migrate_1_31_0 from "./migrate_1_31_0"; import Migrate_1_33_0 from "./migrate_1_33_0"; import Migrate_1_37_0 from "./migrate_1_37_0"; import Migrate_1_38_0 from "./migrate_1_38_0"; +import Migrate_1_39_0 from "./migrate_1_39_0"; const migrations: TMigration[] = [ { @@ -165,6 +166,11 @@ const migrations: TMigration[] = [ to: "1.38.0", migrate: Migrate_1_38_0, }, + { + from: "1.38.0", + to: "1.39.0", + migrate: Migrate_1_39_0, + }, ]; export const preformMigrations = ( diff --git a/src/migrations/migrate_1_38_0.ts b/src/migrations/migrate_1_38_0.ts index 250d2af..32b0340 100644 --- a/src/migrations/migrate_1_38_0.ts +++ b/src/migrations/migrate_1_38_0.ts @@ -1,10 +1,11 @@ import { VaultExplorerPluginSettings_1_37_2 } from "src/types/types-1-37-0"; import MigrationInterface from "./migration_interface"; import { VaultExplorerPluginSettings } from "src/types"; +import { VaultExplorerPluginSettings_1_38_0 } from "src/types/types-1.38.0"; export default class Migrate_1_38_0 implements MigrationInterface { migrate(data: Record) { - const typedData = data as unknown as VaultExplorerPluginSettings_1_37_2; + const typedData = data as unknown as VaultExplorerPluginSettings_1_38_0; const newData: VaultExplorerPluginSettings = { ...typedData, loadBodyTags: true, diff --git a/src/migrations/migrate_1_39_0.ts b/src/migrations/migrate_1_39_0.ts new file mode 100644 index 0000000..dd74e1d --- /dev/null +++ b/src/migrations/migrate_1_39_0.ts @@ -0,0 +1,26 @@ +import MigrationInterface from "./migration_interface"; +import { TExplorerView, VaultExplorerPluginSettings } from "src/types"; +import { VaultExplorerPluginSettings_1_38_0 } from "src/types/types-1.38.0"; + +export default class Migrate_1_39_0 implements MigrationInterface { + migrate(data: Record) { + const typedData = data as unknown as VaultExplorerPluginSettings_1_38_0; + const newData: VaultExplorerPluginSettings = { + ...typedData, + viewOrder: [ + TExplorerView.GRID, + TExplorerView.LIST, + TExplorerView.TABLE, + TExplorerView.FEED, + ], + views: { + ...typedData.views, + table: { + isEnabled: true, + }, + }, + }; + + return newData as unknown as Record; + } +} diff --git a/src/obsidian/vault-explorer-settings-tab.ts b/src/obsidian/vault-explorer-settings-tab.ts index d328390..2349db1 100644 --- a/src/obsidian/vault-explorer-settings-tab.ts +++ b/src/obsidian/vault-explorer-settings-tab.ts @@ -247,8 +247,6 @@ export default class VaultExplorerSettingsTab extends PluginSettingTab { new Setting(containerEl).setName("Table view").addToggle((toggle) => toggle - .setDisabled(true) //TODO implement - .setTooltip("This view is not yet implemented.") .setValue(this.plugin.settings.views.table.isEnabled) .onChange(async (value) => { this.plugin.settings.views.table.isEnabled = value; diff --git a/src/obsidian/vault-explorer-view.ts b/src/obsidian/vault-explorer-view.ts index 2853404..3f569e3 100644 --- a/src/obsidian/vault-explorer-view.ts +++ b/src/obsidian/vault-explorer-view.ts @@ -36,6 +36,7 @@ export default class VaultExplorerView extends ItemView { const containerEl = this.containerEl.children[1]; store.plugin.set(this.plugin); + this.component = new VaultExplorerApp({ target: containerEl, }); diff --git a/src/svelte/app/components/feed-card.svelte b/src/svelte/app/components/feed-card.svelte index e284378..aa56dfd 100644 --- a/src/svelte/app/components/feed-card.svelte +++ b/src/svelte/app/components/feed-card.svelte @@ -49,8 +49,8 @@ const dispatch = createEventDispatcher(); let plugin: VaultExplorerPlugin; - store.plugin.subscribe((value) => { - plugin = value; + store.plugin.subscribe((p) => { + plugin = p; enableFileIcons = plugin.settings.enableFileIcons; removeH1 = plugin.settings.views.feed.removeH1; collapseStyle = plugin.settings.views.feed.collapseStyle; @@ -158,10 +158,6 @@ }); } - function handleTitleContextMenu(e: Event) { - handleCardContextMenu(e); - } - function handleCardMouseOver(e: MouseEvent) { const targetEl = e.currentTarget as HTMLElement; plugin.app.workspace.trigger("hover-link", { @@ -233,14 +229,6 @@ role="link" class="vault-explorer-feed-card__title" on:focus={() => {}} - on:click={(e) => { - e.preventDefault(); - handleTitleClick(); - }} - on:contextmenu={(e) => { - e.preventDefault(); - handleTitleContextMenu(e); - }} on:keydown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); @@ -285,7 +273,7 @@ } .vault-explorer-feed-card:focus-visible { - box-shadow: 0 0 0 3px var(--background-modifier-border-focus); + box-shadow: 0 0 0 3px var(--background-modifier-focus); } .vault-explorer-feed-card__title { diff --git a/src/svelte/app/components/grid-card.svelte b/src/svelte/app/components/grid-card.svelte index e4deffe..252dc94 100644 --- a/src/svelte/app/components/grid-card.svelte +++ b/src/svelte/app/components/grid-card.svelte @@ -159,10 +159,6 @@ handleCardClick(); } - function handleTitleContextMenu(e: Event) { - handleCardContextMenu(e); - } - $: hasFooterContent = tags != null || custom1 != null || custom2 != null || custom3 != null; @@ -249,10 +245,6 @@ e.preventDefault(); handleTitleClick(); }} - on:contextmenu={(e) => { - e.preventDefault(); - handleTitleContextMenu(e); - }} on:keydown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); diff --git a/src/svelte/app/components/list-item.svelte b/src/svelte/app/components/list-item.svelte index 9e5c73d..8133467 100644 --- a/src/svelte/app/components/list-item.svelte +++ b/src/svelte/app/components/list-item.svelte @@ -106,10 +106,6 @@ openInCurrentTab(plugin, path); } - function handleTitleContextMenu(e: Event) { - handleItemContextMenu(e); - } - function handleFavoriteChange(filePath: string, value: boolean) { dispatch("favoritePropertyChange", { filePath, value }); } @@ -166,14 +162,6 @@ role="link" class={titleClassName} on:focus={() => {}} - on:click={(e) => { - e.preventDefault(); - handleTitleClick(); - }} - on:contextmenu={(e) => { - e.preventDefault(); - handleTitleContextMenu(e); - }} on:keydown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); diff --git a/src/svelte/app/components/table-view.svelte b/src/svelte/app/components/table-view.svelte new file mode 100644 index 0000000..6d62e06 --- /dev/null +++ b/src/svelte/app/components/table-view.svelte @@ -0,0 +1,278 @@ + + +
+ + + + {#each columns as column (column.key)} + + {/each} + + + + {#each filteredItems as filteredItem} + handleRowClick(filteredItem.path)} + on:keydown={(e) => { + if (e.key === "Enter" || e.key === " ") { + handleRowClick(filteredItem.path); + } + }} + on:focus={() => {}} + on:contextmenu={(e) => + handleRowContextMenu( + e, + filteredItem.path, + filteredItem.isFavorite, + )} + on:mouseover={(e) => + handleRowMouseOver(e, filteredItem.path)} + > + {#each columns as column (column.key)} + {@const value = getValue(filteredItem, column)} + + {/each} + + {/each} + +
{column.label}
+ {#if column.key == "tags"} + + {#each asStringArray(value) as tag} + + {/each} + + {:else if column.key == "baseName"} +
+ + {#if enableFileIcons} + + {/if} +
+ {value} +
+
+
+ {:else} +
{value}
+ {/if} +
+
+ + diff --git a/src/svelte/app/index.svelte b/src/svelte/app/index.svelte index 75d9d6e..1bbc38c 100644 --- a/src/svelte/app/index.svelte +++ b/src/svelte/app/index.svelte @@ -60,6 +60,7 @@ favoritesStore, TFavoritesCache, } from "./services/favorites-store"; + import TableView from "./components/table-view.svelte"; // ============================================ // Variables @@ -965,6 +966,13 @@ {pageLength} on:favoritePropertyChange={handleFavoritePropertyChange} /> + {:else if currentView === "table"} + {:else if currentView === "feed"}