diff --git a/FEATURES.md b/FEATURES.md index ee3924b..1a66566 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -49,6 +49,8 @@ Features are what the software should do. | Add sticky groups | #filter | | Disable filters condtionally | #filter | | Left/right buttons to allow a user to scroll between groups | #accessibility | +| Duplicate a filter rule | #filter | +| Random sort | #filter | ## Event callbacks diff --git a/manifest.json b/manifest.json index 04b8f91..6b2e600 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "vault-explorer", "name": "Vault Explorer", - "version": "1.19.1", + "version": "1.20.0", "minAppVersion": "1.4.13", "description": "Explore your vault in visual format", "author": "DecafDev", diff --git a/package.json b/package.json index 6031196..5f911a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-vault-explorer", - "version": "1.19.1", + "version": "1.20.0", "description": "Explore your vault in visual format", "main": "main.js", "scripts": { diff --git a/src/obsidian/properties-filter-modal.ts b/src/obsidian/custom-filter-modal.ts similarity index 57% rename from src/obsidian/properties-filter-modal.ts rename to src/obsidian/custom-filter-modal.ts index 8930802..aecface 100644 --- a/src/obsidian/properties-filter-modal.ts +++ b/src/obsidian/custom-filter-modal.ts @@ -1,14 +1,12 @@ import { Modal } from "obsidian"; -import PropertiesFilterApp from "../svelte/properties-filter-app/index.svelte"; +import CustomFilterApp from "../svelte/custom-filter-app/index.svelte"; import VaultExplorerPlugin from "src/main"; -export default class PropertiesFilterModal extends Modal { - component: PropertiesFilterApp | null; +export default class CustomFilterModal extends Modal { + component: CustomFilterApp | null; plugin: VaultExplorerPlugin; - constructor( - plugin: VaultExplorerPlugin, - ) { + constructor(plugin: VaultExplorerPlugin) { super(plugin.app); this.plugin = plugin; this.component = null; @@ -17,7 +15,7 @@ export default class PropertiesFilterModal extends Modal { onOpen(): void { const { contentEl } = this; - this.component = new PropertiesFilterApp({ + this.component = new CustomFilterApp({ target: contentEl, }); } diff --git a/src/svelte/app/components/custom-filter.svelte b/src/svelte/app/components/custom-filter.svelte index 0538948..9268f47 100644 --- a/src/svelte/app/components/custom-filter.svelte +++ b/src/svelte/app/components/custom-filter.svelte @@ -1,13 +1,13 @@ @@ -32,6 +32,7 @@ on:ruleValueChange on:ruleToggle on:ruleDeleteClick + on:ruleDuplicateClick on:propertyNameChange on:propertyTypeChange on:propertyValueDataChange @@ -53,6 +54,7 @@ on:ruleOperatorChange on:ruleValueChange on:ruleToggle + on:ruleDuplicateClick on:ruleDeleteClick /> {/if} @@ -72,6 +74,7 @@ on:ruleOperatorChange on:ruleValueChange on:ruleToggle + on:ruleDuplicateClick on:ruleDeleteClick on:folderSubfoldersToggle /> @@ -91,6 +94,7 @@ on:ruleOperatorChange on:ruleValueChange on:ruleToggle + on:ruleDuplicateClick on:ruleDeleteClick /> {/if} diff --git a/src/svelte/properties-filter-app/components/filter-rule.svelte b/src/svelte/custom-filter-app/components/filter-rule.svelte similarity index 87% rename from src/svelte/properties-filter-app/components/filter-rule.svelte rename to src/svelte/custom-filter-app/components/filter-rule.svelte index 7856c87..435c3b9 100644 --- a/src/svelte/properties-filter-app/components/filter-rule.svelte +++ b/src/svelte/custom-filter-app/components/filter-rule.svelte @@ -23,6 +23,7 @@ import { createEventDispatcher } from "svelte"; import Wrap from "src/svelte/shared/components/wrap.svelte"; import License from "src/svelte/shared/services/license"; + import { Menu } from "obsidian"; export let index: number; export let id: string; @@ -42,6 +43,27 @@ enablePremiumFeatures = isRegistered; }); + function handleActionsClick(e: CustomEvent) { + const nativeEvent = e.detail.nativeEvent as MouseEvent; + + const menu = new Menu(); + menu.setUseNativeMenu(true); + + menu.addItem((item) => { + item.setTitle("Duplicate"); + item.onClick(() => handleDuplicateClick()); + }); + menu.addItem((item) => { + item.setTitle("Delete"); + item.onClick(() => handleDeleteClick()); + }); + menu.showAtMouseEvent(nativeEvent); + } + + function handleDuplicateClick() { + dispatch("ruleDuplicateClick", { id }); + } + function handleDeleteClick() { dispatch("ruleDeleteClick", { id }); } @@ -134,9 +156,9 @@ handleToggle()} /> handleDeleteClick()} + ariaLabel="Rule actions" + iconId="ellipsis-vertical" + on:click={handleActionsClick} /> diff --git a/src/svelte/properties-filter-app/components/folder-filter.svelte b/src/svelte/custom-filter-app/components/folder-filter.svelte similarity index 99% rename from src/svelte/properties-filter-app/components/folder-filter.svelte rename to src/svelte/custom-filter-app/components/folder-filter.svelte index eba07fc..2782c2f 100644 --- a/src/svelte/properties-filter-app/components/folder-filter.svelte +++ b/src/svelte/custom-filter-app/components/folder-filter.svelte @@ -108,6 +108,7 @@ {condition} {isEnabled} on:ruleDeleteClick + on:ruleDuplicateClick on:ruleTypeChange on:ruleConditionChange on:ruleOperatorChange diff --git a/src/svelte/properties-filter-app/components/group-edit-view.svelte b/src/svelte/custom-filter-app/components/group-edit-view.svelte similarity index 94% rename from src/svelte/properties-filter-app/components/group-edit-view.svelte rename to src/svelte/custom-filter-app/components/group-edit-view.svelte index c260474..4ad05e2 100644 --- a/src/svelte/properties-filter-app/components/group-edit-view.svelte +++ b/src/svelte/custom-filter-app/components/group-edit-view.svelte @@ -3,7 +3,7 @@ import IconButton from "src/svelte/shared/components/icon-button.svelte"; import Stack from "src/svelte/shared/components/stack.svelte"; - import { FilterGroup } from "src/types"; + import { TFilterGroup } from "src/types"; import FilterRuleList from "./filter-rule-list.svelte"; import { createEventDispatcher } from "svelte"; @@ -11,7 +11,7 @@ import Spacer from "src/svelte/shared/components/spacer.svelte"; const dispatch = createEventDispatcher(); - export let selectedGroup: FilterGroup; + export let selectedGroup: TFilterGroup; function handleFilterAddClick() { const newFilter = createPropertyFilter(); @@ -44,6 +44,7 @@ on:ruleValueChange on:ruleToggle on:ruleDeleteClick + on:ruleDuplicateClick on:propertyTypeChange on:propertyNameChange on:propertyMatchWhenPropertyDNEChange diff --git a/src/svelte/properties-filter-app/components/group-list-item.svelte b/src/svelte/custom-filter-app/components/group-list-item.svelte similarity index 100% rename from src/svelte/properties-filter-app/components/group-list-item.svelte rename to src/svelte/custom-filter-app/components/group-list-item.svelte diff --git a/src/svelte/properties-filter-app/components/group-list.svelte b/src/svelte/custom-filter-app/components/group-list.svelte similarity index 93% rename from src/svelte/properties-filter-app/components/group-list.svelte rename to src/svelte/custom-filter-app/components/group-list.svelte index 0deab38..601bd44 100644 --- a/src/svelte/properties-filter-app/components/group-list.svelte +++ b/src/svelte/custom-filter-app/components/group-list.svelte @@ -1,10 +1,10 @@