From fe42d4250094086725262f6e89ad1360e321d9b3 Mon Sep 17 00:00:00 2001 From: Sayuop Date: Fri, 28 Nov 2025 20:06:56 +0100 Subject: [PATCH] Release v1.1.5: Bug Fixes & Report Enhancements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This release addresses multiple critical bugs and enhances the reporting experience. ## Bug Fixes - Fixed: Actual time tracking now persists correctly across Pomodoro breaks - Fixed: Timer actual time no longer resets to 0 when resuming work after breaks - Fixed: Stopwatch mode timer bar now displays correctly - Fixed: Daily stats counter no longer increments when canceling/stopping tasks - Fixed: Report quick select buttons now update date fields automatically - Fixed: Today's focus time calculation corrected (previous day restart issue resolved) ## Enhancements - Added visual glow animation to active quick filter buttons in Reports - Quick filter buttons now show active state with pulsing effect - Date inputs update automatically when clicking quick filter options - Improved UX with visual feedback for selected time ranges 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- README.md | 2 +- main.js | 28 ++++++++++++++++++++++++++-- manifest.json | 2 +- package.json | 2 +- src/reportView.ts | 36 ++++++++++++++++++++++++++++++++++-- styles.css | 25 ++++++++++++++++++++++++- 6 files changed, 87 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ade2ef2..dffdc39 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A powerful task management and focus timer plugin for [Obsidian](https://obsidia ![Immerse Banner](https://img.shields.io/badge/Obsidian-Plugin-7c3aed?style=for-the-badge&logo=obsidian&logoColor=white) ![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge) -![Version](https://img.shields.io/badge/Version-1.1.4-blue?style=for-the-badge) +![Version](https://img.shields.io/badge/Version-1.1.5-blue?style=for-the-badge) ## 🎯 Overview diff --git a/main.js b/main.js index 03a7d2b..13d0a28 100644 --- a/main.js +++ b/main.js @@ -982,6 +982,10 @@ var ReportView = class extends import_obsidian3.ItemView { constructor(leaf, plugin) { super(leaf); this.selectedListIds = []; + this.activeQuickFilter = "Last 7 days"; + // Track active filter + this.startDateInput = null; + this.endDateInput = null; this.plugin = plugin; const today = new Date(); this.endDate = today.toISOString().split("T")[0]; @@ -1023,12 +1027,20 @@ var ReportView = class extends import_obsidian3.ItemView { const filtersSection = container.createEl("div", { cls: "immerse-report-filters" }); const dateRow = filtersSection.createEl("div", { cls: "immerse-report-filter-row" }); new import_obsidian3.Setting(dateRow).setName("Start Date").addText((text) => { - text.setValue(this.startDate).onChange((value) => this.startDate = value); + text.setValue(this.startDate).onChange((value) => { + this.startDate = value; + this.activeQuickFilter = null; + }); text.inputEl.type = "date"; + this.startDateInput = text.inputEl; }); new import_obsidian3.Setting(dateRow).setName("End Date").addText((text) => { - text.setValue(this.endDate).onChange((value) => this.endDate = value); + text.setValue(this.endDate).onChange((value) => { + this.endDate = value; + this.activeQuickFilter = null; + }); text.inputEl.type = "date"; + this.endDateInput = text.inputEl; }); const quickFilters = filtersSection.createEl("div", { cls: "immerse-report-quick-filters" }); quickFilters.createEl("span", { text: "Quick select: ", cls: "immerse-filter-label" }); @@ -1043,12 +1055,24 @@ var ReportView = class extends import_obsidian3.ItemView { text: filter.label, cls: "immerse-quick-filter-btn" }); + if (filter.label === this.activeQuickFilter) { + btn.addClass("active"); + } btn.addEventListener("click", () => { const today = new Date(); this.endDate = today.toISOString().split("T")[0]; const startDate = new Date(today); startDate.setDate(startDate.getDate() - filter.days); this.startDate = startDate.toISOString().split("T")[0]; + if (this.startDateInput) + this.startDateInput.value = this.startDate; + if (this.endDateInput) + this.endDateInput.value = this.endDate; + this.activeQuickFilter = filter.label; + quickFilters.querySelectorAll(".immerse-quick-filter-btn").forEach((b) => { + b.removeClass("active"); + }); + btn.addClass("active"); this.renderReport(container); }); }); diff --git a/manifest.json b/manifest.json index d65bae5..c35fb36 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "immerse", "name": "Immerse", - "version": "1.1.4", + "version": "1.1.5", "minAppVersion": "0.15.0", "description": "A Blitzit-inspired task management and focus timer plugin. Plan your day, track time with Pomodoro technique, and crush your tasks with satisfying checkoffs.", "author": "Crib", diff --git a/package.json b/package.json index 2c91927..0669a02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immerse", - "version": "1.1.4", + "version": "1.1.5", "description": "A Blitzit-inspired task management and focus timer plugin for Obsidian", "main": "main.js", "scripts": { diff --git a/src/reportView.ts b/src/reportView.ts index 279fccf..aadb66c 100644 --- a/src/reportView.ts +++ b/src/reportView.ts @@ -14,6 +14,9 @@ export class ReportView extends ItemView { startDate: string; endDate: string; selectedListIds: string[] = []; + activeQuickFilter: string | null = 'Last 7 days'; // Track active filter + startDateInput: HTMLInputElement | null = null; + endDateInput: HTMLInputElement | null = null; constructor(leaf: WorkspaceLeaf, plugin: ImmersePlugin) { super(leaf); @@ -83,16 +86,24 @@ export class ReportView extends ItemView { .setName('Start Date') .addText(text => { text.setValue(this.startDate) - .onChange(value => this.startDate = value); + .onChange(value => { + this.startDate = value; + this.activeQuickFilter = null; // Clear active filter when manually changing dates + }); text.inputEl.type = 'date'; + this.startDateInput = text.inputEl; // Store reference }); new Setting(dateRow) .setName('End Date') .addText(text => { text.setValue(this.endDate) - .onChange(value => this.endDate = value); + .onChange(value => { + this.endDate = value; + this.activeQuickFilter = null; // Clear active filter when manually changing dates + }); text.inputEl.type = 'date'; + this.endDateInput = text.inputEl; // Store reference }); // Quick filters @@ -111,12 +122,33 @@ export class ReportView extends ItemView { text: filter.label, cls: 'immerse-quick-filter-btn' }); + + // Set active class if this is the default active filter + if (filter.label === this.activeQuickFilter) { + btn.addClass('active'); + } + btn.addEventListener('click', () => { + // Update dates const today = new Date(); this.endDate = today.toISOString().split('T')[0]; const startDate = new Date(today); startDate.setDate(startDate.getDate() - filter.days); this.startDate = startDate.toISOString().split('T')[0]; + + // Update date inputs + if (this.startDateInput) this.startDateInput.value = this.startDate; + if (this.endDateInput) this.endDateInput.value = this.endDate; + + // Update active filter + this.activeQuickFilter = filter.label; + + // Update button states + quickFilters.querySelectorAll('.immerse-quick-filter-btn').forEach(b => { + b.removeClass('active'); + }); + btn.addClass('active'); + this.renderReport(container); }); }); diff --git a/styles.css b/styles.css index 4ef9b3b..1b46999 100644 --- a/styles.css +++ b/styles.css @@ -757,15 +757,38 @@ border: 1px solid var(--ft-border); color: var(--ft-text); cursor: pointer; - transition: all 0.2s ease; + transition: all 0.3s ease; font-size: 13px; white-space: nowrap; + position: relative; } .immerse-quick-filter-btn:hover { background: var(--ft-primary); color: white; border-color: var(--ft-primary); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.immerse-quick-filter-btn.active { + background: var(--ft-primary); + color: white; + border-color: var(--ft-primary); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2), + 0 0 20px rgba(99, 102, 241, 0.4); + animation: pulse-glow 2s ease-in-out infinite; +} + +@keyframes pulse-glow { + 0%, 100% { + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2), + 0 0 20px rgba(99, 102, 241, 0.4); + } + 50% { + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.3), + 0 0 25px rgba(99, 102, 241, 0.6); + } } .immerse-report-generate-btn {