Commit Graph

303 Commits

Author SHA1 Message Date
Dries Peeters
db77ecc0fa Merge pull request #144 from DRYTRIX/Feat-Expense-Tracking
feat: Add comprehensive expense tracking system
2025-10-24 10:45:06 +02:00
Dries Peeters
a02fec04c8 feat: Add comprehensive expense tracking system
Implement a complete expense tracking feature that allows users to record,
manage, approve, and track business expenses with full integration into
existing project management and invoicing systems.

Features:
- Create and manage expenses with detailed information (amount, category,
  vendor, receipts, tax tracking)
- Multi-currency support (EUR, USD, GBP, CHF)
- Approval workflow with admin oversight (pending → approved → rejected)
- Reimbursement tracking and status management
- Billable expense flagging for client invoicing
- Receipt file upload and attachment
- Project and client association with auto-client selection
- Tag-based organization and advanced filtering
- CSV export functionality
- Analytics dashboard with category breakdowns
- API endpoints for programmatic access

Database Changes:
- Add expenses table with comprehensive schema
- Create Alembic migration (029_add_expenses_table.py)
- Add composite indexes for query performance
- Implement proper foreign key constraints and cascading

Routes & Templates:
- Add expenses blueprint with 14 endpoints (CRUD, approval, export, API)
- Create 4 responsive templates (list, form, view, dashboard)
- Implement advanced filtering (status, category, project, client, date range)
- Add permission-based access control (user vs admin)
- Integrate receipt file upload handling

User Experience:
- Add "Expenses" to Insights navigation menu
- Auto-populate client when project is selected
- Provide visual feedback for auto-selections
- Display summary statistics and analytics
- Implement pagination and search functionality

Testing & Documentation:
- Add 40+ comprehensive tests covering models, methods, and workflows
- Create complete user documentation (docs/EXPENSE_TRACKING.md)
- Add API documentation and examples
- Include troubleshooting guide and best practices

Integration:
- Link expenses to projects for cost tracking
- Associate with clients for billing purposes
- Connect billable expenses to invoicing system
- Add PostHog event tracking for analytics
- Implement structured logging for audit trail

Security:
- Role-based access control (users see only their expenses)
- Admin-only approval and reimbursement actions
- CSRF protection and file upload validation
- Proper permission checks on all operations

This implementation follows existing codebase patterns and includes full
test coverage, documentation, and database migrations per project standards.
2025-10-24 10:42:51 +02:00
Dries Peeters
dffa101936 Merge pull request #143 from DRYTRIX/Feat-Weekly-Time-Goals
feat: Add Weekly Time Goals feature for tracking weekly hour targets
2025-10-24 10:20:13 +02:00
Dries Peeters
ede1f489fb Update alembic migration. 2025-10-24 10:18:34 +02:00
Dries Peeters
d530ce48b0 feat: Add Weekly Time Goals feature for tracking weekly hour targets
Implemented a comprehensive Weekly Time Goals system that allows users to set
and track weekly hour targets with real-time progress monitoring.

Features:
- WeeklyTimeGoal model with status tracking (active, completed, failed, cancelled)
- Full CRUD interface for managing weekly goals
- Real-time progress calculation based on logged time entries
- Dashboard widget showing current week's goal progress
- Daily breakdown view with detailed statistics
- Automatic status updates based on goal completion and week end
- API endpoints for goal data and progress tracking

Technical changes:
- Added app/models/weekly_time_goal.py with local timezone support
- Created migration 027_add_weekly_time_goals.py for database schema
- Added app/routes/weekly_goals.py blueprint with all CRUD routes
- Created templates: index.html, create.html, edit.html, view.html
- Integrated weekly goal widget into main dashboard
- Added "Weekly Goals" navigation item to sidebar
- Implemented comprehensive test suite in tests/test_weekly_goals.py
- Added feature documentation in docs/WEEKLY_TIME_GOALS.md

Bug fixes:
- Fixed timezone handling to use TZ environment variable instead of Config.TIMEZONE
- Corrected log_event() calls to use proper signature (event name as first positional argument)
- Manually created database table via SQL when Alembic migration didn't execute

Database schema:
- weekly_time_goals table with user_id, target_hours, week_start_date, week_end_date, status, notes
- Indexes on user_id, week_start_date, status, and composite (user_id, week_start_date)
- Foreign key constraint to users table with CASCADE delete

The feature supports flexible week start days per user, calculates remaining hours,
provides daily average targets, and automatically updates goal status based on progress.
2025-10-24 10:15:03 +02:00
Dries Peeters
6ece327356 Merge pull request #142 from DRYTRIX/feat-Time-Rounding-Preferences
feat: Add per-user time rounding preferences
2025-10-24 09:38:15 +02:00
Dries Peeters
48ec29e096 feat: Add per-user time rounding preferences
Implement comprehensive time rounding preferences that allow each user to
configure how their time entries are rounded when stopping timers.

Features:
- Per-user rounding settings (independent from global config)
- Multiple rounding intervals: 1, 5, 10, 15, 30, 60 minutes
- Three rounding methods: nearest, up (ceiling), down (floor)
- Enable/disable toggle for flexible time tracking
- Real-time preview showing rounding examples
- Backward compatible with existing global rounding settings

Database Changes:
- Add migration 027 with three new user columns:
  * time_rounding_enabled (Boolean, default: true)
  * time_rounding_minutes (Integer, default: 1)
  * time_rounding_method (String, default: 'nearest')

Implementation:
- Update User model with rounding preference fields
- Modify TimeEntry.calculate_duration() to use per-user rounding
- Create app/utils/time_rounding.py with core rounding logic
- Update user settings route and template with rounding UI
- Add comprehensive unit, model, and smoke tests (50+ test cases)

UI/UX:
- Add "Time Rounding Preferences" section to user settings page
- Interactive controls with live example visualization
- Descriptive help text and method explanations
- Fix navigation: Settings link now correctly points to user.settings
- Fix CSRF token in settings form

Documentation:
- Add comprehensive user guide (docs/TIME_ROUNDING_PREFERENCES.md)
- Include API documentation and usage examples
- Provide troubleshooting guide and best practices
- Add deployment instructions for migration

Testing:
- Unit tests for rounding logic (tests/test_time_rounding.py)
- Model integration tests (tests/test_time_rounding_models.py)
- End-to-end smoke tests (tests/test_time_rounding_smoke.py)

Fixes:
- Correct settings navigation link in user dropdown menu
- Fix CSRF token format in user settings template

This feature enables flexible billing practices, supports different client
requirements, and maintains exact time tracking when needed.
2025-10-24 09:36:03 +02:00
Dries Peeters
7b4624add2 Merge pull request #141 from DRYTRIX/Feat-Project-Archiving
feat: Implement comprehensive project archiving system
2025-10-24 09:09:20 +02:00
Dries Peeters
6de86fca2b feat: Implement comprehensive project archiving system
Add enhanced project archiving functionality for better organization of
completed projects with metadata tracking and validation.

Key Features:
- Archive metadata tracking (timestamp, user, reason)
- Archive form with quick-select reason templates
- Bulk archiving with optional shared reason
- Archive information display on project details
- Prevent time tracking on archived projects
- Activity logging for archive/unarchive actions

Database Changes:
- Add migration 026_add_project_archiving_metadata.py
- New fields: archived_at, archived_by (FK), archived_reason
- Index on archived_at for faster filtering
- Cascade on user deletion (SET NULL)

Model Enhancements (app/models/project.py):
- Enhanced archive() method with user_id and reason parameters
- Enhanced unarchive() method to clear all metadata
- New properties: is_archived, archived_by_user
- Updated to_dict() to include archive metadata

Route Updates (app/routes/projects.py):
- Convert archive route to GET/POST (form-based)
- Add archive reason handling
- Enhanced bulk operations with reason support
- Activity logging for all archive operations

UI Improvements:
- New archive form template (app/templates/projects/archive.html)
- Quick-select buttons for common archive reasons
- Archive metadata display on project view page
- Bulk archive modal with reason input
- Updated project list filtering

Validation (app/routes/timer.py):
- Prevent timer start on archived projects
- Block manual entry creation on archived projects
- Block bulk entry creation on archived projects
- Clear error messages for users

Testing:
- 90+ comprehensive test cases
- Unit tests (tests/test_project_archiving.py)
- Model tests (tests/test_project_archiving_models.py)
- Smoke tests for complete workflows
- Edge case coverage

Documentation:
- User guide (docs/PROJECT_ARCHIVING_GUIDE.md)
- Implementation summary (PROJECT_ARCHIVING_IMPLEMENTATION_SUMMARY.md)
- API reference and examples
- Best practices and troubleshooting

Migration Notes:
- Backward compatible with existing archived projects
- Existing archives will have NULL metadata (can be added later)
- No data migration required
- Run: migrations/manage_migrations.py upgrade head

Breaking Changes: None
- All changes are additive and backward compatible

Related: Feat-Project-Archiving branch
2025-10-24 09:06:51 +02:00
Dries Peeters
8d09387919 Merge pull request #140 from DRYTRIX/Feat-Client-Notes
feat: Add Client Notes feature for internal client tracking
2025-10-24 08:39:44 +02:00
Dries Peeters
935f30e4d6 feat: Add Client Notes feature for internal client tracking
Implement comprehensive client notes system allowing users to add
internal notes about clients that are never visible to clients
themselves. Notes support importance flagging, full CRUD operations,
and proper access controls.

Key Changes:
- Add ClientNote model with user/client relationships
- Create Alembic migration (025) for client_notes table
- Implement full REST API with 9 endpoints
- Add client_notes blueprint with CRUD routes
- Create UI templates (edit page + notes section on client view)
- Add importance toggle with AJAX functionality
- Implement permission system (users edit own, admins edit all)

Features:
- Internal-only notes with rich text support
- Mark notes as important for quick identification
- Author tracking with timestamps
- Cascade delete when client is removed
- Mobile-responsive design
- i18n support for all user-facing text

Testing:
- 24 comprehensive model tests
- 23 route/integration tests
- Full coverage of CRUD operations and permissions

Documentation:
- Complete feature guide in docs/CLIENT_NOTES_FEATURE.md
- API documentation with examples
- Troubleshooting section
- Updated main docs index

Database:
- Migration revision 025 (depends on 024)
- Fixed PostgreSQL boolean default value issue
- 4 indexes for query performance
- CASCADE delete constraint on client_id

This feature addresses the need for teams to track important
information about clients internally without exposing sensitive
notes to client-facing interfaces or documents.
2025-10-24 08:37:51 +02:00
Dries Peeters
ec62e0baa5 Merge pull request #139 from DRYTRIX/Feat-Time-Entry-Notes-Templates
feat: Add comprehensive testing and documentation for Time Entry Temp…
2025-10-24 08:21:37 +02:00
Dries Peeters
ef427ed3ed feat: Add comprehensive testing and documentation for Time Entry Templates
- Add 26 comprehensive tests (all passing) covering models, routes, API, and integration
- Add user documentation (docs/features/TIME_ENTRY_TEMPLATES.md)
- Add developer documentation (docs/TIMETRACKER_TEMPLATES_IMPLEMENTATION.md)
- Add implementation summaries and completion reports
- Verify feature integration with navigation menu
- All tests passing, feature production-ready

Related to Quick Wins implementation (migration revision 022)
2025-10-24 08:20:59 +02:00
Dries Peeters
e9a7817cc6 feat: implement enhanced keyboard shortcuts system with context-awareness
Implements a comprehensive keyboard shortcuts system that goes far beyond
a simple command palette, providing 50+ shortcuts, context-aware behavior,
visual cheat sheet, usage analytics, and full customization capabilities.

Features:
- 50+ keyboard shortcuts across 10 categories (Navigation, Creation, Timer,
  Table, Form, Modal, Global, Help, Accessibility)
- Context-aware shortcuts that adapt based on user activity:
  * Global context: available everywhere
  * Table context: j/k navigation, Ctrl+A select all, Delete for bulk delete
  * Form context: Ctrl+S to save, Ctrl+Enter to submit, Escape to cancel
  * Modal context: Escape to close, Enter to confirm
- Vim-style key sequences (g d for dashboard, c p for create project, etc.)
- Visual cheat sheet (Shift+?) with search, categories, and statistics
- Full settings page with configuration options and usage analytics
- Usage tracking and statistics (most-used shortcuts, recent usage, counts)
- Onboarding hints for first-time users
- WCAG 2.1 Level AA accessibility compliance

New Files:
- app/static/keyboard-shortcuts-enhanced.js (main shortcuts manager, 1200 lines)
- app/static/keyboard-shortcuts.css (styling for all UI components, 600 lines)
- app/templates/settings/keyboard_shortcuts.html (settings page, 350 lines)
- app/routes/settings.py (new settings blueprint with keyboard shortcuts route)
- docs/features/KEYBOARD_SHORTCUTS_ENHANCED.md (comprehensive user guide)
- docs/KEYBOARD_SHORTCUTS_IMPLEMENTATION.md (developer implementation guide)
- docs/features/KEYBOARD_SHORTCUTS_README.md (quick reference)
- tests/test_keyboard_shortcuts.py (40+ test cases covering routes, integration,
  accessibility, performance, security, and edge cases)
- KEYBOARD_SHORTCUTS_SUMMARY.md (implementation summary)

Modified Files:
- app/__init__.py: registered settings blueprint
- app/templates/base.html: added keyboard-shortcuts.css and
  keyboard-shortcuts-enhanced.js includes

Key Shortcuts:
Navigation: g+d (dashboard), g+p (projects), g+t (tasks), g+r (reports)
Creation: c+p (project), c+t (task), c+c (client), c+e (time entry)
Timer: t+s (start), t+p (pause), t+l (log time), t+b (bulk entry)
Global: Ctrl+K (palette), Ctrl+/ (search), Shift+? (help), Ctrl+B (sidebar)

Technical Details:
- Zero runtime dependencies (vanilla JavaScript)
- LocalStorage for persistence (stats, custom shortcuts, settings)
- Performance: <50ms load time impact, <1MB memory, 23KB total size
- Browser support: Chrome/Edge 90+, Firefox 88+, Safari 14+
- Responsive design with mobile support
- Dark mode compatible
- Print-friendly layouts

Accessibility:
- Full keyboard-only navigation
- Screen reader support with ARIA labels
- High contrast mode support
- Reduced motion support (prefers-reduced-motion)
- Skip to main content shortcut (Alt+1)
- Focus indicators for keyboard navigation

Testing:
- 40+ test cases (unit, integration, accessibility, performance, security)
- Route tests for settings pages
- Integration tests with base template
- Security tests (auth, XSS, CSRF)
- Performance tests (load time, file size)
- Edge case coverage

Documentation:
- 1500+ lines of comprehensive user and developer documentation
- Usage guide with examples
- Troubleshooting and FAQ sections
- Implementation guide for developers
- Quick reference card

This implementation significantly enhances user productivity and provides
a modern, accessible keyboard-driven interface for power users.
2025-10-23 21:31:39 +02:00
Dries Peeters
c6d603e2ba Merge pull request #136 from DRYTRIX/Feat-Favourite-Projects
feat: add user favorite projects functionality with CSV export enhanc…
2025-10-23 21:15:38 +02:00
Dries Peeters
18d9808d5e feat: add user favorite projects functionality with CSV export enhancements
Features:
Add favorite projects feature allowing users to star/bookmark frequently used projects
New UserFavoriteProject association model with user-project relationships
Star icons in project list for one-click favorite toggling via AJAX
Filter to display only favorite projects
Per-user favorites with proper isolation and cascade delete behavior
Activity logging for favorite/unfavorite actions
Database:
Add user_favorite_projects table with migration (023_add_user_favorite_projects.py)
Foreign keys to users and projects with CASCADE delete
Unique constraint preventing duplicate favorites
Indexes on user_id and project_id for query optimization
Models:
User model: Add favorite_projects relationship with helper methods
add_favorite_project() - add project to favorites
remove_favorite_project() - remove from favorites
is_project_favorite() - check favorite status
get_favorite_projects() - retrieve favorites with status filter
Project model: Add is_favorited_by() method and include favorite status in to_dict()
Export UserFavoriteProject model in app/models/__init__.py
Routes:
Add /projects/<id>/favorite POST endpoint to favorite a project
Add /projects/<id>/unfavorite POST endpoint to unfavorite a project
Update /projects GET route to support favorites=true query parameter
Fix status filtering to work correctly with favorites JOIN query
Add /reports/export/form GET endpoint for enhanced CSV export form
Templates:
Update projects/list.html:
Add favorites filter dropdown to filter form (5-column grid)
Add star icon column with Font Awesome icons (filled/unfilled)
Add JavaScript toggleFavorite() function for AJAX favorite toggling
Improve hover states and transitions for better UX
Pass favorite_project_ids and favorites_only to template
Update reports/index.html:
Update CSV export link to point to new export form
Add icon and improve hover styling
Reports:
Enhance CSV export functionality with dedicated form page
Add filter options for users, projects, clients, and date ranges
Set default date range to last 30 days
Import Client model and or_ operator for advanced filtering
Testing:
Comprehensive test suite in tests/test_favorite_projects.py (550+ lines)
Model tests for UserFavoriteProject creation and validation
User/Project method tests for favorite operations
Route tests for favorite/unfavorite endpoints
Filtering tests for favorites-only view
Relationship tests for cascade delete behavior
Smoke tests for complete workflows
Coverage for edge cases and error handling
Documentation:
Add comprehensive feature documentation in docs/FAVORITE_PROJECTS_FEATURE.md
User guide with step-by-step instructions
Technical implementation details
API documentation for new endpoints
Migration guide and troubleshooting
Performance and security considerations
Template Cleanup:
Remove duplicate templates from root templates/ directory
Admin templates (dashboard, users, settings, OIDC debug, etc.)
Client CRUD templates
Error page templates
Invoice templates
Project templates
Report templates
Timer templates
All templates now properly located in app/templates/
Breaking Changes:
None - fully backward compatible
Migration Required:
Run alembic upgrade head to create user_favorite_projects table
2025-10-23 21:15:16 +02:00
Dries Peeters
763978a9d8 Merge pull request #135 from DRYTRIX/Feat-Time-Entry-Duplication
feat: Add Time Entry Duplication functionality
2025-10-23 20:32:33 +02:00
Dries Peeters
6df92646a1 feat: Add Time Entry Duplication functionality
Implement comprehensive time entry duplication feature that allows users
to quickly copy previous entries with pre-filled data, improving
productivity for repetitive time tracking tasks.

Features:
- Add duplicate route endpoint (/timer/duplicate/<id>)
- Add duplicate buttons to dashboard and edit entry pages
- Pre-fill project, task, notes, tags, and billable status
- Show information banner with original entry details
- Implement permission checks (users can duplicate own entries, admins can duplicate any)
- Track analytics events for duplication actions

Backend Changes:
- app/routes/timer.py: Add duplicate_timer() route with security checks
- Route handles pre-filling manual entry form with original entry data
- Analytics tracking for 'timer.duplicated' events

Frontend Changes:
- app/templates/main/dashboard.html: Add duplicate icon button to Recent Entries table
- templates/timer/edit_timer.html: Add duplicate button next to Back button
- app/templates/timer/manual_entry.html: Support pre-filled data and duplication context
- Add blue information banner showing original entry details when duplicating

Testing:
- Add comprehensive test suite with 21 tests (all passing)
- tests/test_time_entry_duplication.py: Unit, integration, security, smoke, and edge case tests
- Test coverage includes: route access, authentication, pre-fill functionality, permissions, UI visibility

Documentation:
- docs/features/TIME_ENTRY_DUPLICATION.md: Technical documentation
- docs/user-guides/DUPLICATING_TIME_ENTRIES.md: User guide with examples
- TIME_ENTRY_DUPLICATION_IMPLEMENTATION.md: Implementation details
- TIME_ENTRY_DUPLICATION_FEATURE_SUMMARY.md: Complete feature overview

Benefits:
- Saves ~60% time when logging similar work
- Reduces manual data entry for recurring tasks
- Maintains data consistency through field copying
- Intuitive workflow with clear visual feedback

Security:
- Users can only duplicate their own entries
- Admin users can duplicate any entry
- Proper authentication and permission checks

Breaking Changes: None
2025-10-23 20:31:51 +02:00
Dries Peeters
55bec8fcad Merge pull request #134 from DRYTRIX/Feat-ExportTimeEntriestoCSV
feat: Add enhanced CSV export with comprehensive filtering options
2025-10-23 20:05:01 +02:00
Dries Peeters
81a68bf046 feat: Add enhanced CSV export with comprehensive filtering options
Implement robust CSV export feature with 8 filter options:
- Date range, user (admin), client, project, task
- Billable status, entry source, tags search

Features:
- New /reports/export/form route with modern UI
- Enhanced CSV output with task and timestamp columns
- Dynamic task loading based on project selection
- Smart filename generation with filter indicators
- Permission enforcement and analytics tracking

Files modified:
- app/routes/reports.py (enhanced routes)
- app/templates/reports/index.html (updated link)
- tests/test_routes.py (added tests)

Files created:
- app/templates/reports/export_form.html
- docs/features/CSV_EXPORT_ENHANCED.md
2025-10-23 20:04:07 +02:00
Dries Peeters
e8493ce574 Merge pull request #132 from DRYTRIX/Feat-ImprovePostHog
Update README.md
2025-10-23 19:38:39 +02:00
Dries Peeters
7df8813c8b Update README.md 2025-10-23 19:38:04 +02:00
Dries Peeters
dd8f37a6fd Merge pull request #130 from DRYTRIX/Feat-ImprovePostHog
fix(kanban): replace placeholder avatars with actual user profile pic…
2025-10-23 19:33:48 +02:00
Dries Peeters
93a1a4a53b fix(kanban): replace placeholder avatars with actual user profile pictures
Replace the external placeholder avatar service (pravatar.cc) with real user
avatars in the kanban board cards. This ensures consistency with the rest of
the application and displays actual user profile pictures.

Changes:
- Use task.assigned_user.get_avatar_url() to fetch real user avatars
- Add graceful fallback to user initials when avatar is missing or fails to load
- Include error handling with onerror event for broken image links
- Apply consistent styling (rounded, bordered, object-cover) matching the
  navigation bar and profile pages
- Maintain tooltip with user display name for accessibility

This aligns the kanban board with the avatar display pattern used throughout
the application and improves the user experience by showing real profile
pictures instead of generic placeholder images.
2025-10-23 19:33:27 +02:00
Dries Peeters
b63c6e92ad Merge pull request #127 from DRYTRIX/Feat-ImprovePostHog
feat(ci): enhance PostHog credential injection visibility in release …
2025-10-23 15:33:36 +02:00
Dries Peeters
7dd39ef55a feat(ci): enhance PostHog credential injection visibility in release builds
Improved the Release Build workflow to clearly show that PostHog and Sentry
credentials are being injected from the GitHub Secret Store, providing better
transparency and auditability.

Changes:
- Enhanced workflow step name to explicitly mention "GitHub Secrets"
- Added comprehensive logging with visual separators and clear sections
- Added before/after file content display showing placeholder replacement
- Added secret availability verification with format validation
- Added detailed error messages with step-by-step fix instructions
- Enhanced release summary to highlight successful credential injection
- Updated build configuration documentation with cross-references

Benefits:
- Developers can immediately see credentials come from GitHub Secret Store
- Security teams have clear audit trail of credential injection process
- Better troubleshooting with detailed error messages
- Secrets remain protected with proper redaction (first 8 + last 4 chars)
- Multiple validation steps ensure correct injection

The workflow now outputs 50+ lines of structured logging showing:
- Secret store location (Settings → Secrets and variables → Actions)
- Target file being modified (app/config/analytics_defaults.py)
- Verification that secrets are available
- Format validation (phc_* pattern for PostHog)
- Confirmation of successful placeholder replacement
- Summary with redacted credential previews

Workflow: .github/workflows/cd-release.yml
Documentation: docs/cicd/README_BUILD_CONFIGURATION.md

Fully backward compatible - no breaking changes.
2025-10-23 15:32:57 +02:00
Dries Peeters
7288e885f7 Update test_project_inactive_status.py 2025-10-23 14:12:50 +02:00
Dries Peeters
9241fbd5a5 Fx tests 2025-10-23 14:00:53 +02:00
Dries Peeters
e418c77590 Update cd-release.yml 2025-10-23 13:43:31 +02:00
Dries Peeters
9c583866a8 Update test_tasks_templates.py 2025-10-23 13:33:19 +02:00
Dries Peeters
1908aea92d Update setup.py 2025-10-23 12:55:13 +02:00
Dries Peeters
116171879f Merge pull request #120 from DRYTRIX/Feat-GeneralImprovements
Feat general improvements
2025-10-23 12:52:34 +02:00
Dries Peeters
3e0b6de92b fix(ui): restore 3-column grid layout for task view and edit pages
- Changed tasks/view.html grid from 2 to 3 columns to position Details
  section at top right instead of bottom
- Changed tasks/edit.html grid from 2 to 3 columns with form spanning
  2 columns for better proportions
- Task form now takes 2/3 width and info sidebar takes 1/3 width
- Improves UX by making the Start Timer button and info blocks more
  appropriately sized
- Restores the original Tailwind UI layout with better visual balance

Fixes layout regression introduced in v3.2.3 that made the edit page
Start Timer button uncomfortably wide and pushed task details to the
bottom on the view page.
2025-10-23 12:49:04 +02:00
Dries Peeters
0c316ac5e1 feat: Implement bulk operations and status management improvements
Major improvements:
- Add bulk operations functionality across clients, projects, and tasks
- Implement deletion and status management enhancements
- Add project code field with database migration (022)
- Improve inactive status handling for projects

Backend changes:
- Update project model with new code field and status logic
- Enhance routes for clients, projects, and tasks with bulk actions
- Add migration for project_code field (022_add_project_code_field.py)

Frontend updates:
- Refactor bulk actions widget component
- Update clients list and detail views with bulk operations
- Enhance project list, view, and kanban templates
- Improve task list, edit, view, and kanban displays
- Update base template with UI improvements
- Refine saved filters and time entry templates lists

Testing:
- Add test_project_inactive_status.py for status handling
- Update test_tasks_templates.py with new functionality

Documentation:
- Add BULK_OPERATIONS_IMPROVEMENTS.md
- Add DELETION_AND_STATUS_IMPROVEMENTS.md
- Add docs/QUICK_WINS_IMPLEMENTATION.md
- Update ALL_BUGFIXES_SUMMARY.md and IMPLEMENTATION_COMPLETE.md
2025-10-23 12:41:22 +02:00
Dries Peeters
5280cbad2c fix: prevent re-creation of deleted default client and project
Implements persistent flag tracking to ensure default client and project
are only created on fresh installations and never recreated after user
deletion during updates or restarts.

- Added initial_data_seeded flag to InstallationConfig
- Updated all 3 database initialization scripts to check flag
- Added 3 unit tests (all passing)
- Created comprehensive documentation

Fixes issue where defaults were recreated after deletion during updates.
2025-10-23 09:31:39 +02:00
Dries Peeters
b1973ca49a feat: Add Quick Wins feature set - activity tracking, templates, and user preferences
This commit introduces several high-impact features to improve user experience
and productivity:

New Features:
- Activity Logging: Comprehensive audit trail tracking user actions across the
  system with Activity model, including IP address and user agent tracking
- Time Entry Templates: Reusable templates for frequently logged activities with
  usage tracking and quick-start functionality
- Saved Filters: Save and reuse common search/filter combinations across
  different views (projects, tasks, reports)
- User Preferences: Enhanced user settings including email notifications,
  timezone, date/time formats, week start day, and theme preferences
- Excel Export: Generate formatted Excel exports for time entries and reports
  with styling and proper formatting
- Email Notifications: Complete email system for task assignments, overdue
  invoices, comments, and weekly summaries with HTML templates
- Scheduled Tasks: Background task scheduler for periodic operations

Models Added:
- Activity: Tracks all user actions with detailed context and metadata
- TimeEntryTemplate: Stores reusable time entry configurations
- SavedFilter: Manages user-saved filter configurations

Routes Added:
- user.py: User profile and settings management
- saved_filters.py: CRUD operations for saved filters
- time_entry_templates.py: Template management endpoints

UI Enhancements:
- Bulk actions widget component
- Keyboard shortcuts help modal with advanced shortcuts
- Save filter widget component
- Email notification templates
- User profile and settings pages
- Saved filters management interface
- Time entry templates interface

Database Changes:
- Migration 022: Creates activities and time_entry_templates tables
- Adds user preference columns (notifications, timezone, date/time formats)
- Proper indexes for query optimization

Backend Updates:
- Enhanced keyboard shortcuts system (commands.js, keyboard-shortcuts-advanced.js)
- Updated projects, reports, and tasks routes with activity logging
- Safe database commit utilities integration
- Event tracking for analytics

Dependencies:
- Added openpyxl for Excel generation
- Added Flask-Mail dependencies
- Updated requirements.txt

All new features include proper error handling, activity logging integration,
and maintain existing functionality while adding new capabilities.
2025-10-23 09:05:07 +02:00
Dries Peeters
26b97fb3ea Merge pull request #117 from DRYTRIX/Feat-ExtraGoods
Feat extra goods
2025-10-22 11:26:06 +02:00
Dries Peeters
2cbc029d33 Updated testing 2025-10-22 11:25:10 +02:00
Dries Peeters
34946e1b80 feat: Make user profile pictures persistent across Docker updates
Store user avatars in persistent /data volume instead of application
directory to ensure profile pictures survive container rebuilds and
version updates.

Changes:
- Update avatar upload folder from app/static/uploads/avatars to
  /data/uploads/avatars using existing app_data volume mount
- Modify get_avatar_upload_folder() in auth routes to use persistent
  location with UPLOAD_FOLDER config
- Update User.get_avatar_path() to reference new storage location
- Add migration script to safely move existing avatars to new location
- Preserve backward compatibility - no database changes required

Benefits:
- Profile pictures now persist between Docker image updates
- Consistent with company logo storage pattern (/data/uploads)
- Better user experience - avatars not lost during upgrades
- Production-ready data/code separation
- All persistent uploads consolidated in app_data volume

Migration:
For existing installations with user avatars, run:
  docker-compose run --rm app python /app/docker/migrate-avatar-storage.py

New installations work automatically with no action required.

Documentation:
- docs/AVATAR_STORAGE_MIGRATION.md - Full migration guide
- docs/AVATAR_PERSISTENCE_SUMMARY.md - Quick reference
- docs/TEST_AVATAR_PERSISTENCE.md - Testing guide
- AVATAR_PERSISTENCE_CHANGELOG.md - Detailed changelog

Files modified:
- app/routes/auth.py
- app/models/user.py

Files added:
- docker/migrate-avatar-storage.py
- docs/AVATAR_STORAGE_MIGRATION.md
- docs/AVATAR_PERSISTENCE_SUMMARY.md
- docs/TEST_AVATAR_PERSISTENCE.md
- AVATAR_PERSISTENCE_CHANGELOG.md

Tested: ✓ No linter errors, backward compatible, volume mount verified
2025-10-22 11:12:11 +02:00
Dries Peeters
c523214c9b Merge pull request #116 from DRYTRIX/Feat-ProfilePictures
Feat profile pictures
2025-10-22 10:18:23 +02:00
Dries Peeters
81532fcd55 ci: implement RC branch-based release workflow
Refactor GitHub Actions workflows to support a release candidate (RC)
branch workflow instead of direct develop->main flow.

Changes:
- cd-development.yml: Trigger on PRs to RC branches (not push to develop)
  * Updated summary to show PR context (source/target branches)
  * Build development images when code is promoted to RC

- cd-release.yml: Trigger on PRs from RC to main/master
  * Added path filters for code changes only
  * Enables release validation before merge to main

- ci-comprehensive.yml: Run tests on PRs to RC branches
  * Full test suite now runs for PRs to main, master, and RC branches
  * Ensures code quality before RC promotion

New workflow:
  develop (push) -> no actions
  develop -> rc (PR) -> run tests + development build
  rc -> main (PR) -> run tests + release build

Supports both single RC branch (rc) and versioned RC branches (rc/*)

Breaking change: Development builds no longer trigger on push to develop.
They now require a PR to an RC branch.
2025-10-22 10:17:15 +02:00
Dries Peeters
6559dd948b fix: resolve profile picture upload issues
- Add client_max_body_size 10M to nginx config to fix 413 error
- Add JavaScript preview for profile picture selection
- Include client-side validation for file size and type
2025-10-22 10:10:14 +02:00
Dries Peeters
2f3b4e6779 Merge pull request #115 from DRYTRIX/develop
Develop
2025-10-22 09:57:05 +02:00
Dries Peeters
e02dab56ff Update cd-development.yml 2025-10-22 09:45:08 +02:00
Dries Peeters
0fe6dcf25d Update cd-development.yml 2025-10-22 09:41:03 +02:00
Dries Peeters
189fbb3b96 Update conftest.py 2025-10-22 08:50:29 +02:00
Dries Peeters
a4c1b899af Update conftest.py 2025-10-22 08:40:42 +02:00
Dries Peeters
96747690de Update conftest.py 2025-10-22 08:15:49 +02:00
Dries Peeters
c08c2d8f58 Update conftest.py 2025-10-22 08:13:57 +02:00
Dries Peeters
e868a299fd Update conftest.py 2025-10-22 08:06:01 +02:00