From f4f5471ad727feeda27f5edc0950c742e8f3a5ac Mon Sep 17 00:00:00 2001 From: DecafDev <40307803+decaf-dev@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:25:46 -0600 Subject: [PATCH] Add clock updates setting (#106) * feat: add enable clock updates setting * feat: add event handler for clock updates change * refactor: update description * chore: bump version --- manifest.json | 2 +- package.json | 2 +- src/constants.ts | 3 +- src/event/types.ts | 2 +- src/main.ts | 16 +- src/obsidian/vault-explorer-settings-tab.ts | 23 +- src/svelte/app/index.svelte | 292 ++++++++++++-------- src/types/index.ts | 1 + src/types/types-1.12.1.ts | 213 ++++++++++++++ versions.json | 3 +- 10 files changed, 419 insertions(+), 138 deletions(-) create mode 100644 src/types/types-1.12.1.ts diff --git a/manifest.json b/manifest.json index a9aa912..75c60b9 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "vault-explorer", "name": "Vault Explorer", - "version": "1.12.1", + "version": "1.13.0", "minAppVersion": "1.4.13", "description": "Explore your vault in visual format", "author": "DecafDev", diff --git a/package.json b/package.json index d68ef18..13f9829 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-vault-explorer", - "version": "1.12.1", + "version": "1.13.0", "description": "Explore your vault in visual format", "main": "main.js", "scripts": { diff --git a/src/constants.ts b/src/constants.ts index 7d35d45..54c6756 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -40,7 +40,8 @@ export const DEFAULT_SETTINGS: VaultExplorerPluginSettings = { views: { currentView: ViewType.GRID, order: [ViewType.GRID, ViewType.LIST], - titleWrapping: "normal" + titleWrapping: "normal", + enableClockUpdates: true }, pageSize: 50, pluginVersion: null diff --git a/src/event/types.ts b/src/event/types.ts index a6723ef..49f4479 100644 --- a/src/event/types.ts +++ b/src/event/types.ts @@ -1,3 +1,3 @@ -export type PluginEvent = "file-rename" | "file-create" | "file-delete" | "file-modify" | "metadata-change" | "properties-filter-update" | "folder-rename" | "folder-delete" | "folder-create" | "page-size-setting-change" | "title-wrapping-setting-change" | "property-setting-change" | "device-registration-change"; +export type PluginEvent = "file-rename" | "file-create" | "file-delete" | "file-modify" | "metadata-change" | "properties-filter-update" | "folder-rename" | "folder-delete" | "folder-create" | "page-size-setting-change" | "title-wrapping-setting-change" | "property-setting-change" | "device-registration-change" | "clock-updates-setting-change" export type EventCallback = (...data: unknown[]) => void; diff --git a/src/main.ts b/src/main.ts index 0623e51..032985e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -23,6 +23,7 @@ import { loadDeviceId } from './svelte/shared/services/device-id-utils'; import License from './svelte/shared/services/license'; import { VaultExplorerPluginSettings_1_8_1 } from './types/types-1.8.1'; import { VaultExplorerPluginSettings_1_9_1 } from './types/types-1.9.1'; +import { VaultExplorerPluginSettings_1_12_1 } from './types/types-1.12.1'; export default class VaultExplorerPlugin extends Plugin { settings: VaultExplorerPluginSettings = DEFAULT_SETTINGS; @@ -292,7 +293,7 @@ export default class VaultExplorerPlugin extends Plugin { if (isVersionLessThan(settingsVersion, "1.10.0")) { console.log("Upgrading settings from version 1.9.1 to 1.10.0"); const typedData = (data as unknown) as VaultExplorerPluginSettings_1_9_1; - const newData: VaultExplorerPluginSettings = { + const newData: VaultExplorerPluginSettings_1_12_1 = { ...typedData, filters: { ...typedData.filters, @@ -321,6 +322,19 @@ export default class VaultExplorerPlugin extends Plugin { } data = newData as unknown as Record; } + + if (isVersionLessThan(settingsVersion, "1.13.0")) { + console.log("Upgrading settings from version 1.12.1 to 1.13.0"); + const typedData = (data as unknown) as VaultExplorerPluginSettings_1_12_1; + const newData: VaultExplorerPluginSettings = { + ...typedData, + views: { + ...typedData.views, + enableClockUpdates: true + } + } + data = newData as unknown as Record; + } } //Apply default settings. This will make it so we don't need to do migrations for just adding new settings diff --git a/src/obsidian/vault-explorer-settings-tab.ts b/src/obsidian/vault-explorer-settings-tab.ts index 99f26e7..849f55f 100644 --- a/src/obsidian/vault-explorer-settings-tab.ts +++ b/src/obsidian/vault-explorer-settings-tab.ts @@ -162,6 +162,19 @@ export default class VaultExplorerSettingsTab extends PluginSettingTab { EventManager.getInstance().emit("property-setting-change"); })); + new Setting(containerEl).setName("Updates").setHeading(); + + new Setting(containerEl) + .setName("Enable clock updates") + .setDesc("When enabled, time values will update every minute. This will cause a refresh of the Vault Explorer view. When disabled, time values will only update when the view is opened.") + .addToggle(toggle => toggle + .setValue(this.plugin.settings.views.enableClockUpdates) + .onChange(async (value) => { + this.plugin.settings.views.enableClockUpdates = value; + await this.plugin.saveSettings(); + EventManager.getInstance().emit("clock-updates-setting-change"); + })); + new Setting(containerEl).setName("Premium").setHeading(); this.component = new Component({ @@ -193,16 +206,6 @@ export default class VaultExplorerSettingsTab extends PluginSettingTab { }); } - private getSettingMessageClassName(type: "success" | "failure" | "default" = "default") { - let className = "vault-explorer-setting-message"; - if (type === "success") { - className += " vault-explorer-setting-message--success"; - } else if (type === "failure") { - className += " vault-explorer-setting-message--failure"; - } - return className; - } - onClose() { this.component?.$destroy(); } diff --git a/src/svelte/app/index.svelte b/src/svelte/app/index.svelte index 8fcc71d..10ef537 100644 --- a/src/svelte/app/index.svelte +++ b/src/svelte/app/index.svelte @@ -1,11 +1,14 @@
@@ -691,24 +739,24 @@ changePage(1)} + on:click={() => handlePageChange(1)} /> changePage(currentPage - 1)} + on:click={() => handlePageChange(currentPage - 1)} /> changePage(currentPage + 1)} + on:click={() => handlePageChange(currentPage + 1)} /> changePage(totalPages)} + on:click={() => handlePageChange(totalPages)} /> diff --git a/src/types/index.ts b/src/types/index.ts index c9a6e41..8f349e3 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -23,6 +23,7 @@ export interface VaultExplorerPluginSettings { currentView: ViewType; order: ViewType[]; titleWrapping: WordBreak; + enableClockUpdates: boolean; } pageSize: number; pluginVersion: string | null; diff --git a/src/types/types-1.12.1.ts b/src/types/types-1.12.1.ts new file mode 100644 index 0000000..6cb0d33 --- /dev/null +++ b/src/types/types-1.12.1.ts @@ -0,0 +1,213 @@ +export interface VaultExplorerPluginSettings_1_12_1 { + logLevel: string; + properties: { + favorite: string; + url: string; + createdDate: string; + modifiedDate: string; + custom1: string; + custom2: string; + custom3: string; + }, + filters: { + search: string; + onlyFavorites: boolean; + sort: SortFilter; + timestamp: TimestampFilter; + custom: { + selectedGroupId: string; + groups: FilterGroup[]; + } + }, + views: { + currentView: ViewType; + order: ViewType[]; + titleWrapping: WordBreak; + } + pageSize: number; + pluginVersion: string | null; +} + +export type WordBreak = "normal" | "break-word"; + +export enum ViewType { + GRID = "grid", + LIST = "list", +} + +export type FilterOperator = "and" | "or"; + +export enum TextFilterCondition { + IS = "is", + IS_NOT = "is-not", + CONTAINS = "contains", + DOES_NOT_CONTAIN = "does-not-contain", + STARTS_WITH = "starts-with", + ENDS_WITH = "ends-with", + EXISTS = "exists", + DOES_NOT_EXIST = "does-not-exist", +} + +export enum ListFilterCondition { + CONTAINS = "contains", + DOES_NOT_CONTAIN = "does-not-contain", + EXISTS = "exists", + DOES_NOT_EXIST = "does-not-exist", +} + +export enum NumberFilterCondition { + IS_EQUAL = "is-equal", + IS_NOT_EQUAL = "is-not-equal", + IS_GREATER = "is-greater", + IS_LESS = "is-less", + IS_GREATER_OR_EQUAL = "is-greater-or-equal", + IS_LESS_OR_EQUAL = "is-less-or-equal", + EXISTS = "exists", + DOES_NOT_EXIST = "does-not-exist", +} + +export enum CheckboxFilterCondition { + IS = "is", + IS_NOT = "is-not", + EXISTS = "exists", + DOES_NOT_EXIST = "does-not-exist", +} + +//TODO: add is between +export enum DateFilterCondition { + IS = "is", + IS_BEFORE = "is-before", + IS_AFTER = "is-after", + IS_ON_OR_BEFORE = "is-on-or-before", + IS_ON_OR_AFTER = "is-on-or-after", + EXISTS = "exists", + DOES_NOT_EXIST = "does-not-exist", +} + +export enum ContentFilterCondition { + CONTAINS = "contains", + DOES_NOT_CONTAIN = "does-not-contain", + IS_EMPTY = "is-empty", + IS_NOT_EMPTY = "is-not-empty", +} + +//TODO add is child of and is parent of? +export enum FolderFilterCondition { + IS = "is", + IS_NOT = "is-not", +} + +export enum FileNameFilterCondition { + IS = "is", + IS_NOT = "is-not", + CONTAINS = "contains", + DOES_NOT_CONTAIN = "does-not-contain", + STARTS_WITH = "starts-with", + ENDS_WITH = "ends-with", +} + +export type FilterCondition = TextFilterCondition | NumberFilterCondition | DateFilterCondition | CheckboxFilterCondition | ListFilterCondition | ContentFilterCondition | FolderFilterCondition | FileNameFilterCondition; + +//This matches the Obsidian property types +export enum PropertyType { + TEXT = "text", + NUMBER = "number", + LIST = "list", + CHECKBOX = "checkbox", + DATE = "date", + DATETIME = "datetime", +} + +export enum FilterRuleType { + PROPERTY = "property", + FOLDER = "folder", + FILE_NAME = "file-name", + CONTENT = "content", +} + +export enum DatePropertyFilterValue { + TODAY = "today", + TOMORROW = "tomorrow", + YESTERDAY = "yesterday", + ONE_WEEK_FROM_NOW = "one-week-from-now", + ONE_WEEK_AGO = "one-week-ago", + ONE_MONTH_FROM_NOW = "one-month-from-now", + ONE_MONTH_AGO = "one-month-ago", + CUSTOM = "custom" +} + +interface BaseFilterRule { + id: string; + operator: FilterOperator; + type: FilterRuleType; + condition: FilterCondition; + isEnabled: boolean; + value: string; + matchWhenPropertyDNE: boolean; +} + +export interface TextPropertyFilterRule extends BaseFilterRule { + type: FilterRuleType.PROPERTY; + propertyType: PropertyType.TEXT; + propertyName: string; + condition: TextFilterCondition; +} + +export interface NumberPropertyFilterRule extends BaseFilterRule { + type: FilterRuleType.PROPERTY; + propertyType: PropertyType.NUMBER; + propertyName: string; + condition: NumberFilterCondition; +} + +export interface ListPropertyFilterRule extends BaseFilterRule { + type: FilterRuleType.PROPERTY; + propertyType: PropertyType.LIST; + propertyName: string; + condition: ListFilterCondition; +} + +export interface CheckboxPropertyFilterRule extends BaseFilterRule { + type: FilterRuleType.PROPERTY; + propertyType: PropertyType.CHECKBOX; + propertyName: string; + condition: CheckboxFilterCondition; +} + +export interface DatePropertyFilterRule extends BaseFilterRule { + type: FilterRuleType.PROPERTY; + propertyType: PropertyType.DATE | PropertyType.DATETIME; + propertyName: string; + condition: DateFilterCondition; + valueData: string; +} + +export interface FolderFilterRule extends BaseFilterRule { + type: FilterRuleType.FOLDER; + condition: FolderFilterCondition; + includeSubfolders: boolean; +} + +export interface FileNameFilterRule extends BaseFilterRule { + type: FilterRuleType.FILE_NAME; + condition: FileNameFilterCondition; +} + +export interface ContentFilterRule extends BaseFilterRule { + type: FilterRuleType.CONTENT; + condition: ContentFilterCondition; +} + +export type FilterRule = PropertyFilterRule | FolderFilterRule | FileNameFilterRule | ContentFilterRule; +export type PropertyFilterRule = TextPropertyFilterRule | NumberPropertyFilterRule | ListPropertyFilterRule | CheckboxPropertyFilterRule | DatePropertyFilterRule; + +export interface FilterGroup { + id: string; + name: string; + rules: FilterRule[]; + isEnabled: boolean; +} + +export type SortFilter = "file-name-asc" | "file-name-desc" | "modified-asc" | "modified-desc"; + +export type TimestampFilter = "created-today" | "modified-today" | "created-this-week" | "modified-this-week" | "created-2-weeks" | "modified-2-weeks" | "all"; diff --git a/versions.json b/versions.json index a62b4dd..18ce724 100644 --- a/versions.json +++ b/versions.json @@ -65,5 +65,6 @@ "1.10.0": "1.4.13", "1.11.0": "1.4.13", "1.12.0": "1.4.13", - "1.12.1": "1.4.13" + "1.12.1": "1.4.13", + "1.13.0": "1.4.13" }