- Add 'nb' (Norwegian Bokmål) to translation extraction script
This ensures Norwegian translations are properly included when
extracting and updating translation catalogs.
- Improve translation compilation error logging
Add exc_info=True to log full exception tracebacks when translation
compilation fails, making it easier to diagnose issues with missing
or corrupted .mo files.
Fixes issue where Norwegian (norsk) translations were not working
due to missing compiled .mo files. The app will now properly compile
Norwegian translations on startup, and any compilation errors will
be logged with full stack traces for debugging.
Replace display:none with visibility-based hiding to reserve space
for the support banner from page load. This prevents the page from
jumping when the banner becomes visible after the 2-second delay.
- Use opacity-0/invisible instead of hidden class to keep element in layout
- Reserve banner space immediately when it should be shown
- Add smooth transition for better UX
- Update dismiss function to use new visibility classes
- Fix keyboard shortcuts to respect text input focus
* Delete/Backspace only removes elements when not editing text fields
* Arrow keys only move elements when not editing text fields
* Prevents accidental deletion while typing in properties panel
- Add full editing support for items table and expenses table
* Properties panel now shows editable fields for table Groups
* Supports editing header text, font size, font style, and color
* Supports editing items template, font size, and color
* Supports editing separator line color and width
* Supports editing table width
- Fix table selection behavior
* Clicking on child elements (header, items, line) now selects parent Group
* Ensures table can be selected and edited from any part
* Adds click handlers to all child elements when creating tables
- Improve error handling and debugging
* Add comprehensive logging for troubleshooting
* Add try-catch blocks for table property processing
* Add fallback display for unrecognized Groups
This fixes the issue where users couldn't edit table properties and
prevents frustrating accidental deletions while typing in input fields.
- Add custom scrollbar styling for sidebar navigation menu
- Implement thin, subtle scrollbar with transparent track
- Support both light and dark themes with appropriate opacity
- Add hover effects for better user interaction
- Compatible with Firefox (scrollbar-width/color) and Webkit browsers
- Fixes default browser scrollbar appearance when sidebar content overflows
- Add Norwegian (Norsk) language support with locale code normalization (no -> nb)
- Create Norwegian translation files (translations/nb/ and translations/no/)
- Fill empty Norwegian translation strings with English fallback values
- Add locale normalization for Flask-Babel compatibility (no -> nb mapping)
- Update context processor to correctly display 'Norsk' label instead of 'NB'
Translation improvements:
- Wrap all hardcoded strings in templates with _() translation function
- Add missing translations for setup, timer, tasks, invoices, and admin templates
- Ensure brandnames 'drytrix' and 'TimeTracker' remain untranslated across all languages
- Add new translation strings to all language files (en, de, nl, fr, it, fi, es, no, ar, he)
- Update translation files for: initial_setup, manual_entry, tasks/list, email_templates, etc.
Bug fixes:
- Add missing /api/summary/today endpoint for daily summary notifications
- Fix 'Response body already consumed' error in smart-notifications.js
- Improve translation compilation logging and error handling
- Add debug endpoint /debug/i18n for troubleshooting translation issues
Technical changes:
- Improve ensure_translations_compiled() with better logging
- Add locale normalization function for Norwegian locale handling
- Update context processor to reverse-map normalized locales for display
- Fix JavaScript fetch error handling to check response.ok before reading body
The onboarding tour was incorrectly rendering on mobile devices (width < 768px), appearing as a small dot in the top-left corner with a dark overlay that blocked app access on the dashboard screen.
Changes:
- Add mobile detection (width <= 768px) in OnboardingManager.init() to prevent tour initialization on mobile devices
- Skip auto-start of tour on mobile in DOMContentLoaded handler
- Mark tour as completed on mobile to prevent future attempts
- Add window resize handler to cancel active tour if window is resized to mobile size
- Add mobile-responsive CSS styles for tooltip (for future use)
- Apply same mobile checks to EnhancedOnboardingManager
The tour is now automatically disabled on mobile devices, allowing users to access the app without the broken overlay blocking them. The tour continues to work normally on desktop devices.
Fixes: Onboarding tour broken layout on mobile (< 768px width)
Implement comprehensive webhook system supporting 40+ event types with automatic retries, HMAC signatures, delivery tracking, REST API, and admin UI. Integrates with Activity logging for automatic event triggering.
- Database: Add webhooks and webhook_deliveries tables (migration 046)
- API: Full CRUD endpoints with read:webhooks/write:webhooks scopes
- UI: Admin interface for webhook management and testing
- Service: Automatic retry with exponential backoff every 5 minutes
- Security: HMAC-SHA256 signature verification
- Tests: Model and service tests included
- Docs: Complete integration guide with examples
- Fix script block name from extra_js to scripts_extra to match base.html
- Replace inline onclick handlers with event listeners to fix scope issues
- Fix ReferenceError for toggleViewMode and insertVariable functions
- Improve editor initialization flow with proper script loading detection
- Add error handling and fallback to textarea if Toast UI Editor fails to load
- Add debug logging for troubleshooting initialization issues
- Ensure default templates are editable (no restrictions in backend)
- Add email templates link to admin menu in base.html
- Remove ENV file configuration details from email support page
The editor now properly initializes and all interactive features work correctly.
Improve donation visibility by adding multiple strategic placement options
while maintaining a non-intrusive user experience. Removed footer bar that
was causing layout issues and replaced with better alternatives.
Changes:
- Remove footer bar from all pages to fix layout positioning issues
- Add "Support" button in header (visible on md+ screens) with amber gradient styling
- Add dismissible support banner that appears after 2 seconds with 7-day cooldown
- Enhance sidebar BuyMeACoffee link with gradient background and hover effects
- Keep existing dashboard widget for BuyMeACoffee (gradient card in sidebar)
- Add translation strings for new support-related UI elements
The new approach provides multiple touchpoints:
1. Header button - Always visible but subtle
2. Dismissible banner - Appears occasionally, respects user choice
3. Dashboard widget - Contextual placement on main dashboard
4. Sidebar link - Always accessible in navigation
This ensures users can easily find the donation option without being
overwhelmed by intrusive prompts.
Create complete features overview documenting all 120+ features across
12 major categories, and update main README and docs README with
enhanced feature descriptions and links.
Changes:
- Add docs/FEATURES_COMPLETE.md with comprehensive feature documentation
covering all features organized by category (Time Tracking, Project
Management, Task Management, Client Management, Invoicing, Financial
Management, Reporting & Analytics, User Management & Security,
Productivity Features, Administration, Integration & API, Technical)
- Update README.md:
- Add reference to complete features documentation
- Expand feature descriptions with additional features (Focus Sessions,
Recurring Time Blocks, Budget Alerts, Weekly Goals, etc.)
- Enhance feature descriptions with more detail
- Update docs/README.md:
- Add "Complete Features Reference" section at top
- Reorganize feature documentation into logical groups
- Add links to additional feature docs (Payment Tracking, Budget
Alerts, Weekly Goals, etc.)
This provides users with a single comprehensive reference for all
available features while maintaining the quick overview in the main
README. The documentation is now better organized and more discoverable.
Implement a complete audit logging system to track all changes made to
tracked entities, providing full compliance and accountability capabilities.
Features:
- Automatic tracking of create, update, and delete operations on 25+ models
- Detailed field-level change tracking with old/new value comparison
- User attribution with IP address, user agent, and request path logging
- Web UI for viewing and filtering audit logs with pagination
- REST API endpoints for programmatic access
- Entity-specific history views
- Comprehensive test coverage (unit, model, route, and smoke tests)
Core Components:
- AuditLog model with JSON-encoded value storage and decoding helpers
- SQLAlchemy event listeners for automatic change detection
- Audit utility module with defensive programming for table existence checks
- Blueprint routes for audit log viewing and API access
- Jinja2 templates for audit log list, detail, and entity history views
- Database migration (044) creating audit_logs table with proper indexes
Technical Implementation:
- Uses SQLAlchemy 'after_flush' event listener to capture changes
- Tracks 25+ models including Projects, Tasks, TimeEntries, Invoices, Clients, Users, etc.
- Excludes sensitive fields (passwords) and system fields (id, timestamps)
- Implements lazy import pattern to avoid circular dependencies
- Graceful error handling to prevent audit logging from breaking core functionality
- Transaction-safe logging that integrates with main application transactions
Fixes:
- Resolved login errors caused by premature transaction commits
- Fixed circular import issues with lazy model loading
- Added table existence checks to prevent errors before migrations
- Improved error handling with debug-level logging for non-critical failures
UI/UX:
- Added "Audit Logs" link to admin dropdown menu
- Organized admin menu into logical sections for better usability
- Filterable audit log views by entity type, user, action, and date range
- Color-coded action badges and side-by-side old/new value display
- Pagination support for large audit log datasets
Documentation:
- Added comprehensive feature documentation
- Included troubleshooting guide and data examples
- Created diagnostic scripts for verifying audit log setup
Testing:
- Unit tests for AuditLog model and value encoding/decoding
- Route tests for all audit log endpoints
- Integration tests for audit logging functionality
- Smoke tests for end-to-end audit trail verification
This implementation provides a robust foundation for compliance tracking
and change accountability without impacting application performance or
requiring code changes in existing routes/models.
Implement per-project Kanban column workflows, allowing different projects
to have their own custom kanban board columns and task states.
Changes:
- Add project_id field to KanbanColumn model (nullable, NULL = global columns)
- Create Alembic migration 043 to add project_id column with foreign key
- Update unique constraint from (key) to (key, project_id) to allow same
keys across different projects
- Update all KanbanColumn model methods to filter by project_id:
- get_active_columns(project_id=None)
- get_all_columns(project_id=None)
- get_column_by_key(key, project_id=None)
- get_valid_status_keys(project_id=None)
- initialize_default_columns(project_id=None)
- reorder_columns(column_ids, project_id=None)
- Update kanban routes to support project filtering:
- /kanban/columns accepts project_id query parameter
- /kanban/columns/create supports project selection
- All CRUD operations redirect to project-filtered view when applicable
- API endpoints support project_id parameter
- Update project view route to use project-specific columns
- Update task routes to validate status against project-specific columns
- Add fallback logic: projects without custom columns use global columns
- Update UI templates:
- Add project filter dropdown in column management page
- Add project selection in create column form
- Show project info in edit column page
- Update reorder API calls to include project_id
Database Migration:
- Migration 043 adds project_id column (nullable)
- Existing columns remain global (project_id = NULL)
- New unique constraint on (key, project_id)
- Foreign key constraint with CASCADE delete
Backward Compatibility:
- Existing global columns continue to work
- Projects without custom columns fall back to global columns
- Task status validation uses project-specific columns when available
Impact: High - Enables multi-project teams to have different workflows
per project while maintaining backward compatibility with existing
global column setup.