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 @@