Compare commits
3 Commits
8207b3626e
...
v1.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 50ef40d2e0 | |||
| b3aa1f2992 | |||
| e1484b1723 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -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
|
|
||||||
8
main.js
8
main.js
@@ -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,9 +1455,11 @@ 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;
|
||||||
|
if (!preserveActualTime) {
|
||||||
task.actualMinutes = 0;
|
task.actualMinutes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
this.isTimerRunning = false;
|
this.isTimerRunning = false;
|
||||||
this.activeTaskId = null;
|
this.activeTaskId = null;
|
||||||
this.secondsWorkedOnCurrentTask = 0;
|
this.secondsWorkedOnCurrentTask = 0;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "immerse",
|
"id": "immerse",
|
||||||
"name": "Immerse",
|
"name": "Immerse",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"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.0",
|
"version": "1.1.1",
|
||||||
"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": {
|
||||||
|
|||||||
13
src/main.ts
13
src/main.ts
@@ -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,11 +806,12 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.isTimerRunning = false;
|
this.isTimerRunning = false;
|
||||||
this.activeTaskId = null;
|
this.activeTaskId = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user