5 Commits

Author SHA1 Message Date
886a2f7372 fix: Button text overflow in stopwatch mode controls
- Fixed button text overflowing in active task controls
- Changed flex behavior to allow proper text wrapping
- Increased minimum button width from 80px to 100px
- Added word-wrap and line-height for multi-line text support
- Buttons now properly contain text like 'Continue Working'

Fixes button overflow issue in stopwatch mode where text would
extend outside button boundaries instead of wrapping.
2025-11-25 17:11:57 +01:00
68e11c57e1 v1.1.2 - Bug fixes: Fixed Text on buttons to wrap and adapt properly 2025-11-25 17:07:14 +01:00
50ef40d2e0 Release v1.1.1: Critical timer bug fix
Fixed critical bug where actual time spent on tasks was being reset to 0 when resuming work after a break in Pomodoro mode.

## Bug Fix
- Fixed timer actual time resetting to 0 when skipping break or resuming work
- Added preserveActualTime parameter to stopTimer() function
- Actual time now correctly accumulates across multiple Pomodoro sessions
2025-11-25 10:11:05 +01:00
b3aa1f2992 Improve .gitignore comments and patterns 2025-11-24 21:22:48 +01:00
e1484b1723 Update .gitignore to exclude release notes and versioned roadmaps 2025-11-24 21:19:47 +01:00
7 changed files with 27 additions and 183 deletions

6
.gitignore vendored
View File

@@ -1,7 +1,8 @@
# Build output # Build output (main.js is tracked for easy installation)
*.js.map *.js.map
release/ release/
*.zip *.zip
immerse-*.zip
# npm # npm
node_modules/ node_modules/
@@ -22,6 +23,7 @@ data.json
# Development/Documentation (not for distribution) # Development/Documentation (not for distribution)
RELEASE-GUIDE.md RELEASE-GUIDE.md
ROADMAP.md ROADMAP.md
ROADMAP_*.md
deploy-test.bat deploy-test.bat
.claude/ .claude/
RELEASE_NOTES_v1.1.0.md RELEASE_NOTES_*.md

View File

@@ -1,166 +0,0 @@
# Immerse v1.1.0 Release Notes
Release Date: November 24, 2024
## 🎉 What's New
### 📈 Reporting & Analytics System
A complete analytics dashboard to track your productivity over time!
**Features:**
- **Key Metrics Dashboard**: View tasks completed, tasks per day, hours per day, minutes per task, and current day streak
- **Visual Charts**: Beautiful pie chart showing distribution of tasks, hours, and pomodoros
- **Time by List Analysis**: See exactly how much time you spend on different task categories
- **Productivity Insights**: Discover your most productive hour, day, and month
- **Daily Breakdown**: Visual bar charts showing the last 10 days of activity with tasks, hours, and pomodoros
- **Flexible Filtering**: Quick filters (Today, Last 7/30/90 days) plus custom date range selection
- **Report View**: Dedicated view accessible via "📊 Reports" button
### 🗓️ Task Scheduling & Reminders
Never miss a deadline with the new scheduling system!
**Features:**
- **Schedule Tasks**: Set specific date and time when tasks are due
- **Smart Reminders**: Choose notification timing (5, 10, 15, 30, or 60 minutes before due time)
- **Visual Indicators**:
- Blue 📅 badge shows scheduled date/time
- Red ⚠️ pulsing "OVERDUE" badge for past-due tasks
- Red left border highlight on overdue tasks
- **Background Monitoring**: Automatic checks every 30 seconds for upcoming/overdue tasks
- **Startup Alerts**: Get notified when opening Obsidian if tasks are overdue
- **Sound Notifications**: Optional audio alerts for reminders (respects sound settings)
- **Duplicate Prevention**: Smart tracking ensures you don't get reminded multiple times
### 📱 Mobile Optimization
Full responsive design for excellent mobile experience!
**Improvements:**
- **Responsive Layouts**: All UI elements adapt to mobile screen sizes
- **Touch-Friendly**:
- Minimum 44px tap targets (Apple's recommended size)
- Larger checkboxes (28px on mobile)
- Larger action buttons
- **Optimized Views**:
- Pie charts scale down appropriately (220px on tablets, 180px on phones)
- Stats grid adapts (2 columns on tablets, 1 column on small phones)
- Daily breakdown bars stack vertically on mobile
- Modal buttons become full-width and stack
- **Always Visible Actions**: Task action buttons always visible on mobile (no hover needed)
- **Adaptive Typography**: Font sizes scale appropriately for readability
## 🔧 Technical Improvements
### Performance
- Efficient report generation with on-demand calculation
- Optimized reminder checks with 30-second intervals
- Smart caching to prevent duplicate notifications
### Code Structure
- New `reportView.ts` file for analytics view
- Enhanced type definitions for scheduling and reporting
- Improved data tracking for historical statistics
- Better separation of concerns
### Compatibility
- Fully compatible with Obsidian desktop and mobile
- Works with both light and dark themes
- Respects user's sound and notification preferences
## 📊 Statistics Tracked
The plugin now tracks comprehensive statistics including:
- Total tasks completed
- Total time spent (all-time and daily)
- Total pomodoros completed
- Tasks per day average
- Hours per day average
- Minutes per task average
- Current day streak
- Most productive hour/day/month
- Time breakdown by task list
## 🎨 UI/UX Enhancements
- New "📊 Reports" button in main view header
- Modern, clean report interface with gradient accents
- Color-coded progress bars using list colors
- Hover effects and animations for better interactivity
- Responsive filter controls
- Improved date picker styling and alignment
## 🐛 Bug Fixes
- Fixed pie chart rendering issues (now uses proper color values)
- Improved gradient calculation for proper segment display
- Better normalization of metrics (using time-based calculations)
- Fixed date input alignment in report filters
## ⚙️ Settings Updates
### New Settings:
- **Enable Reminders**: Toggle reminder notifications on/off
- **Default Reminder Minutes**: Set default reminder time for new scheduled tasks (default: 30 minutes)
### Updated Settings:
All existing settings remain compatible with no migration required.
## 📱 Mobile Testing Recommendations
To ensure the best experience on mobile:
1. **Test on actual device**: Install Obsidian mobile and test the plugin
2. **Browser DevTools**: Use Chrome/Edge DevTools device emulation
3. **Responsive breakpoints**:
- Desktop: >768px
- Tablet: ≤768px
- Phone: ≤480px
## 🔄 Upgrade Instructions
### From v1.0.x:
1. **Backup your data** (optional but recommended):
- Your tasks and settings are in `.obsidian/plugins/immerse/data.json`
- Make a copy before updating
2. **Update files**:
- Copy `main.js`, `manifest.json`, and `styles.css` to your vault
- **DO NOT replace `data.json`** - this contains your tasks!
3. **Reload Obsidian**:
- Press Ctrl/Cmd+R to reload
- Or restart Obsidian
4. **Verify**:
- Check that your tasks are still there
- Click "📊 Reports" to see your new analytics
- Try scheduling a task with a reminder
## 🚀 What's Next (v1.2.0)
Future enhancements we're considering:
- Calendar view integration
- Export reports (PDF/CSV)
- More chart types and visualizations
- Task templates
- Recurring tasks
- Advanced filtering options
## 💡 Feedback
Found a bug or have a feature request?
- Open an issue: [https://git.cribdev.com/crib/immerse/issues](https://git.cribdev.com/crib/immerse/issues)
- Join the discussion in the repository
## 🙏 Credits
Special thanks to:
- [Blitzit](https://www.blitzit.app/) for continued inspiration
- The Obsidian community for feedback and support
- Claude.ai for development assistance
---
**Enjoy v1.1.0!**
Made with ❤️ for the Obsidian community

10
main.js
View File

@@ -1287,7 +1287,7 @@ var ImmersePlugin = class extends import_obsidian4.Plugin {
const task = this.data.tasks.find((t) => t.id === taskId); const task = this.data.tasks.find((t) => t.id === taskId);
if (!task) if (!task)
return; return;
this.stopTimer(); this.stopTimer(true);
this.activeTaskId = taskId; this.activeTaskId = taskId;
task.isActive = true; task.isActive = true;
this.isBreakMode = false; this.isBreakMode = false;
@@ -1325,7 +1325,7 @@ var ImmersePlugin = class extends import_obsidian4.Plugin {
const task = this.data.tasks.find((t) => t.id === taskId); const task = this.data.tasks.find((t) => t.id === taskId);
if (!task) if (!task)
return; return;
this.stopTimer(); this.stopTimer(true);
this.activeTaskId = taskId; this.activeTaskId = taskId;
task.isActive = true; task.isActive = true;
this.isBreakMode = false; this.isBreakMode = false;
@@ -1446,7 +1446,7 @@ var ImmersePlugin = class extends import_obsidian4.Plugin {
this.updateStatusBar(); this.updateStatusBar();
this.refreshView(); this.refreshView();
} }
stopTimer() { stopTimer(preserveActualTime = false) {
if (this.timerInterval) { if (this.timerInterval) {
window.clearInterval(this.timerInterval); window.clearInterval(this.timerInterval);
this.timerInterval = null; this.timerInterval = null;
@@ -1455,7 +1455,9 @@ var ImmersePlugin = class extends import_obsidian4.Plugin {
const task = this.data.tasks.find((t) => t.id === this.activeTaskId); const task = this.data.tasks.find((t) => t.id === this.activeTaskId);
if (task) { if (task) {
task.isActive = false; task.isActive = false;
task.actualMinutes = 0; if (!preserveActualTime) {
task.actualMinutes = 0;
}
} }
} }
this.isTimerRunning = false; this.isTimerRunning = false;

View File

@@ -1,7 +1,7 @@
{ {
"id": "immerse", "id": "immerse",
"name": "Immerse", "name": "Immerse",
"version": "1.1.0", "version": "1.1.2",
"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",

View File

@@ -1,6 +1,6 @@
{ {
"name": "immerse", "name": "immerse",
"version": "1.1.0", "version": "1.1.2",
"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": {

View File

@@ -544,8 +544,8 @@ export default class ImmersePlugin extends Plugin {
const task = this.data.tasks.find(t => t.id === taskId); const task = this.data.tasks.find(t => t.id === taskId);
if (!task) return; if (!task) return;
// Stop any existing timer // Stop any existing timer, preserving actual time
this.stopTimer(); this.stopTimer(true);
// Set active task // Set active task
this.activeTaskId = taskId; this.activeTaskId = taskId;
@@ -606,7 +606,7 @@ export default class ImmersePlugin extends Plugin {
const task = this.data.tasks.find(t => t.id === taskId); const task = this.data.tasks.find(t => t.id === taskId);
if (!task) return; if (!task) return;
this.stopTimer(); this.stopTimer(true);
this.activeTaskId = taskId; this.activeTaskId = taskId;
task.isActive = true; task.isActive = true;
this.isBreakMode = false; this.isBreakMode = false;
@@ -796,7 +796,7 @@ export default class ImmersePlugin extends Plugin {
this.refreshView(); this.refreshView();
} }
stopTimer() { stopTimer(preserveActualTime: boolean = false) {
if (this.timerInterval) { if (this.timerInterval) {
window.clearInterval(this.timerInterval); window.clearInterval(this.timerInterval);
this.timerInterval = null; this.timerInterval = null;
@@ -806,9 +806,10 @@ export default class ImmersePlugin extends Plugin {
const task = this.data.tasks.find(t => t.id === this.activeTaskId); const task = this.data.tasks.find(t => t.id === this.activeTaskId);
if (task) { if (task) {
task.isActive = false; task.isActive = false;
// Reset actual time when manually stopping (not after a break) // Only reset actual time when manually stopping (not when resuming after break)
// This allows starting fresh next time if (!preserveActualTime) {
task.actualMinutes = 0; task.actualMinutes = 0;
}
} }
} }

View File

@@ -288,11 +288,16 @@
} }
.immerse-active-controls .immerse-btn { .immerse-active-controls .immerse-btn {
flex: 1; flex: 1 1 auto;
min-width: 80px; min-width: 100px;
max-width: 100%;
background: rgba(255, 255, 255, 0.2); background: rgba(255, 255, 255, 0.2);
color: white; color: white;
border: none; border: none;
white-space: normal;
word-wrap: break-word;
line-height: 1.3;
padding: 8px 12px;
} }
.immerse-active-controls .immerse-btn:hover { .immerse-active-controls .immerse-btn:hover {