Release v1.1.5: Bug Fixes & Report Enhancements
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 <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@ A powerful task management and focus timer plugin for [Obsidian](https://obsidia
|
|||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
## 🎯 Overview
|
## 🎯 Overview
|
||||||
|
|
||||||
|
|||||||
28
main.js
28
main.js
@@ -982,6 +982,10 @@ var ReportView = class extends import_obsidian3.ItemView {
|
|||||||
constructor(leaf, plugin) {
|
constructor(leaf, plugin) {
|
||||||
super(leaf);
|
super(leaf);
|
||||||
this.selectedListIds = [];
|
this.selectedListIds = [];
|
||||||
|
this.activeQuickFilter = "Last 7 days";
|
||||||
|
// Track active filter
|
||||||
|
this.startDateInput = null;
|
||||||
|
this.endDateInput = null;
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
this.endDate = today.toISOString().split("T")[0];
|
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 filtersSection = container.createEl("div", { cls: "immerse-report-filters" });
|
||||||
const dateRow = filtersSection.createEl("div", { cls: "immerse-report-filter-row" });
|
const dateRow = filtersSection.createEl("div", { cls: "immerse-report-filter-row" });
|
||||||
new import_obsidian3.Setting(dateRow).setName("Start Date").addText((text) => {
|
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";
|
text.inputEl.type = "date";
|
||||||
|
this.startDateInput = text.inputEl;
|
||||||
});
|
});
|
||||||
new import_obsidian3.Setting(dateRow).setName("End Date").addText((text) => {
|
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";
|
text.inputEl.type = "date";
|
||||||
|
this.endDateInput = text.inputEl;
|
||||||
});
|
});
|
||||||
const quickFilters = filtersSection.createEl("div", { cls: "immerse-report-quick-filters" });
|
const quickFilters = filtersSection.createEl("div", { cls: "immerse-report-quick-filters" });
|
||||||
quickFilters.createEl("span", { text: "Quick select: ", cls: "immerse-filter-label" });
|
quickFilters.createEl("span", { text: "Quick select: ", cls: "immerse-filter-label" });
|
||||||
@@ -1043,12 +1055,24 @@ var ReportView = class extends import_obsidian3.ItemView {
|
|||||||
text: filter.label,
|
text: filter.label,
|
||||||
cls: "immerse-quick-filter-btn"
|
cls: "immerse-quick-filter-btn"
|
||||||
});
|
});
|
||||||
|
if (filter.label === this.activeQuickFilter) {
|
||||||
|
btn.addClass("active");
|
||||||
|
}
|
||||||
btn.addEventListener("click", () => {
|
btn.addEventListener("click", () => {
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
this.endDate = today.toISOString().split("T")[0];
|
this.endDate = today.toISOString().split("T")[0];
|
||||||
const startDate = new Date(today);
|
const startDate = new Date(today);
|
||||||
startDate.setDate(startDate.getDate() - filter.days);
|
startDate.setDate(startDate.getDate() - filter.days);
|
||||||
this.startDate = startDate.toISOString().split("T")[0];
|
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);
|
this.renderReport(container);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "immerse",
|
"id": "immerse",
|
||||||
"name": "Immerse",
|
"name": "Immerse",
|
||||||
"version": "1.1.4",
|
"version": "1.1.5",
|
||||||
"minAppVersion": "0.15.0",
|
"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.",
|
"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",
|
"author": "Crib",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "immerse",
|
"name": "immerse",
|
||||||
"version": "1.1.4",
|
"version": "1.1.5",
|
||||||
"description": "A Blitzit-inspired task management and focus timer plugin for Obsidian",
|
"description": "A Blitzit-inspired task management and focus timer plugin for Obsidian",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ export class ReportView extends ItemView {
|
|||||||
startDate: string;
|
startDate: string;
|
||||||
endDate: string;
|
endDate: string;
|
||||||
selectedListIds: 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) {
|
constructor(leaf: WorkspaceLeaf, plugin: ImmersePlugin) {
|
||||||
super(leaf);
|
super(leaf);
|
||||||
@@ -83,16 +86,24 @@ export class ReportView extends ItemView {
|
|||||||
.setName('Start Date')
|
.setName('Start Date')
|
||||||
.addText(text => {
|
.addText(text => {
|
||||||
text.setValue(this.startDate)
|
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';
|
text.inputEl.type = 'date';
|
||||||
|
this.startDateInput = text.inputEl; // Store reference
|
||||||
});
|
});
|
||||||
|
|
||||||
new Setting(dateRow)
|
new Setting(dateRow)
|
||||||
.setName('End Date')
|
.setName('End Date')
|
||||||
.addText(text => {
|
.addText(text => {
|
||||||
text.setValue(this.endDate)
|
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';
|
text.inputEl.type = 'date';
|
||||||
|
this.endDateInput = text.inputEl; // Store reference
|
||||||
});
|
});
|
||||||
|
|
||||||
// Quick filters
|
// Quick filters
|
||||||
@@ -111,12 +122,33 @@ export class ReportView extends ItemView {
|
|||||||
text: filter.label,
|
text: filter.label,
|
||||||
cls: 'immerse-quick-filter-btn'
|
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', () => {
|
btn.addEventListener('click', () => {
|
||||||
|
// Update dates
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
this.endDate = today.toISOString().split('T')[0];
|
this.endDate = today.toISOString().split('T')[0];
|
||||||
const startDate = new Date(today);
|
const startDate = new Date(today);
|
||||||
startDate.setDate(startDate.getDate() - filter.days);
|
startDate.setDate(startDate.getDate() - filter.days);
|
||||||
this.startDate = startDate.toISOString().split('T')[0];
|
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);
|
this.renderReport(container);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
25
styles.css
25
styles.css
@@ -757,15 +757,38 @@
|
|||||||
border: 1px solid var(--ft-border);
|
border: 1px solid var(--ft-border);
|
||||||
color: var(--ft-text);
|
color: var(--ft-text);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.3s ease;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.immerse-quick-filter-btn:hover {
|
.immerse-quick-filter-btn:hover {
|
||||||
background: var(--ft-primary);
|
background: var(--ft-primary);
|
||||||
color: white;
|
color: white;
|
||||||
border-color: var(--ft-primary);
|
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 {
|
.immerse-report-generate-btn {
|
||||||
|
|||||||
Reference in New Issue
Block a user