116 Commits

Author SHA1 Message Date
Dries Peeters
bd2ba4b4c8 Merge pull request #55 from DRYTRIX/develop
Develop
v1.6.2
2025-09-16 20:29:34 +02:00
Dries Peeters
544dc5867e Merge pull request #54 from DRYTRIX/Feat-UpdateKanbanBoard
feat: enhance UI/UX across application with improved styling and mobi…
2025-09-16 20:28:30 +02:00
Dries Peeters
5bb109a98e feat: enhance UI/UX across application with improved styling and mobile responsiveness
- Update Kanban board: remove alert system, clean up styling and JavaScript
- Enhance task management: add collapsible filters, improve button layouts
- Improve mobile responsiveness: standardize colors, spacing, and component styling
- Modernize CSS: implement CSS custom properties for consistent theming
- Update templates: standardize button styling and layout across all pages
- Refactor invoice interface: improve form layouts and visual consistency
- Enhance admin pages: better spacing and mobile-friendly designs

This update provides a more cohesive and modern user experience across
desktop and mobile devices with improved accessibility and visual consistency.
2025-09-16 20:28:00 +02:00
Dries Peeters
8c7e6402ea Merge pull request #53 from DRYTRIX/develop
Develop
v1.6.1
2025-09-12 14:36:05 +02:00
Dries Peeters
5a415302d4 Merge pull request #52 from DRYTRIX/Feat-PDFTemplateDesigner
PDF Layout Editor: local GrapesJS, admin UI, i18n, preview fixes
2025-09-12 14:35:38 +02:00
Dries Peeters
4ef035dc78 PDF Layout Editor: local GrapesJS, admin UI, i18n, preview fixes
Add admin PDF Layout Editor with local GrapesJS (no CDN)
Routes:
GET/POST /admin/pdf-layout (save, server-side default seeding)
POST /admin/pdf-layout/reset (clear custom template)
GET /admin/pdf-layout/default (serve default body HTML/CSS)
POST /admin/pdf-layout/preview (render preview with sample context)
Invoice PDF generator: support custom HTML/CSS and i18n; add default template and CSS
Preview: sanitize Jinja, add helpers (format_date, format_money), sample item
Base layout: include head_extra and scripts_extra
Editor UI: removed quick blocks, preview, and insert variables; keep load/save/reset
Vendor GrapesJS under app/static/vendor/grapesjs and load locally
README: document the new feature and usage
2025-09-12 14:35:08 +02:00
Dries Peeters
016fe5ead0 feat(ui): refresh templates and dashboards; improve admin and error pages
- Update global layout and styles: `app/templates/base.html`, `app/static/base.css`
- Modernize analytics dashboards (web + mobile)
- Revamp auth pages: login, profile, edit profile
- Refresh error pages: 400/403/404/500 and generic
- Polish main dashboard and search
- Enhance tasks views: create/edit/view, kanban, my/overdue
- Update clients, projects, invoices, and reports pages
- Refine timer pages (timer/edit/manual_entry)
- Tweak admin routes and templates
- Update license server util and integration docs
- Refresh README and help/about content

Notes:
- UI-focused changes; no database migrations included.
2025-09-12 10:03:40 +02:00
Dries Peeters
989089bb48 Merge pull request #51 from DRYTRIX/develop
Develop
v1.6.0
2025-09-11 23:09:29 +02:00
Dries Peeters
93dbd1fed1 Merge pull request #50 from DRYTRIX/Feature-Translations
feat(i18n): add translations, locale switcher, and user language pref…
2025-09-11 23:09:07 +02:00
Dries Peeters
69f9f1140d feat(i18n): add translations, locale switcher, and user language preference
- Integrate Flask-Babel and i18n utilities; initialize in app factory
- Add `preferred_language` to `User` with Alembic migration (011_add_user_preferred_language)
- Add `babel.cfg` and `scripts/extract_translations.py`
- Add `translations/` for en, de, fr, it, nl, fi
- Update templates to use `_()` and add language picker in navbar/profile
- Respect locale in routes and context processors; persist user preference
- Update requirements and Docker/Docker entrypoint for Babel/gettext support
- Minor copy and style adjustments across pages

Migration: run `alembic upgrade head`
2025-09-11 23:08:41 +02:00
Dries Peeters
e5cb82c686 Merge pull request #49 from DRYTRIX/Feature-KanbanView
Feature kanban view
2025-09-11 20:36:10 +02:00
Dries Peeters
e5a8728285 feat(kanban): add Kanban board view, drag-and-drop, and API support
- Add Kanban board partial and integrate into tasks list
  - app/templates/tasks/_kanban.html
  - app/templates/tasks/list.html
- Update API to support task status moves and ordering
  - app/routes/api.py
- Expose Kanban in layout/navigation and polish UI
  - app/templates/base.html
  - app/static/base.css
- Link/entry points from related pages
  - templates/projects/view.html
  - templates/reports/index.html
- Minor profile page adjustments
  - app/templates/auth/profile.html
2025-09-11 20:35:19 +02:00
Dries Peeters
e43aa9936d feat(tasks): add draggable Kanban and make it the only view
- Add reusable Kanban partial (app/templates/tasks/_kanban.html) with HTML5
  drag-and-drop and optimistic status updates via PUT /api/tasks/<id>/status
- Tasks overview (app/templates/tasks/list.html): replace grid with Kanban and
  remove the List/Kanban toggle so Kanban is the sole view
- Project page (templates/projects/view.html): replace task cards grid with the
  same Kanban board
2025-09-11 11:30:10 +02:00
Dries Peeters
be7fe735eb Merge pull request #48 from DRYTRIX/develop
Develop
v1.5.2
2025-09-10 11:50:40 +02:00
Dries Peeters
a815a27780 Merge pull request #47 from DRYTRIX/Bug-UIIssues
feat: local SQLite test env, UI fixes, and DB migrations
2025-09-10 11:50:16 +02:00
Dries Peeters
7486037307 feat: local SQLite test env, UI fixes, and DB migrations
- UI/UX: Refine layouts and responsive styles; fix task and timer views; update
  shared components and dashboard templates
  - Updates across `app/templates/**`, `templates/**`, `app/static/base.css`,
    and `app/static/mobile.css`
- Backend: Route cleanups and minor fixes for admin, auth, invoices, and timer
  - Touches `app/routes/admin.py`, `app/routes/auth.py`, `app/routes/api.py`,
    `app/routes/invoices.py`, `app/routes/timer.py`
- DevOps: Improve Docker setup and add local testing workflow
  - Update `Dockerfile`, `docker/start-fixed.py`
  - Add `docker-compose.local-test.yml`, `.env.local-test`, start scripts
- Docs: Update `README.md` and add `docs/LOCAL_TESTING_WITH_SQLITE.md`
- Utilities: Adjust CLI and PDF generator behavior

Database (Alembic) migrations:
- 005_add_missing_columns.py
- 006_add_logo_and_task_timestamps.py
- 007_add_invoice_and_more_settings_columns.py
- 008_align_invoices_and_settings_more.py
- 009_add_invoice_created_by.py
- 010_enforce_single_active_timer.py

BREAKING CHANGE: Only one active timer per user is now enforced.

Note: Apply database migrations after deploy (e.g., `alembic upgrade head`).
2025-09-10 11:49:49 +02:00
Dries Peeters
dee5e8d4d8 Merge pull request #46 from DRYTRIX/Bug-FixSQLiteDBCreation
Update Dockerfile
2025-09-08 12:19:48 +02:00
Dries Peeters
eeb496098c Update Dockerfile 2025-09-08 12:19:20 +02:00
Dries Peeters
164893c6e8 Merge pull request #45 from DRYTRIX/develop
Develop
v1.5.1
2025-09-08 12:11:45 +02:00
Dries Peeters
c6d704e5f1 Merge pull request #44 from DRYTRIX/Feat-ImproveDarkMode
Major CSS overhaul: Enhanced UI/UX with modern animations and perfec…
2025-09-08 12:11:11 +02:00
Dries Peeters
1ab0122cc7 Major CSS overhaul: Enhanced UI/UX with modern animations and perfect dark mode
Features:
- Added shimmer effects and micro-interactions across all components
- Implemented gradient backgrounds and enhanced visual hierarchy
- Created smooth hover animations with cubic-bezier transitions
- Enhanced markdown editor with professional styling and dark mode support
- Improved task cards with animated progress bars and status badges
- Added responsive design optimizations for mobile devices

 Technical improvements:
- Consolidated and optimized CSS across 6 template files
- Implemented consistent design system with unified color palette
- Added hardware-accelerated animations for 60fps performance
- Enhanced accessibility with proper focus states and contrast ratios
- Created modular CSS architecture with clear organization

 Dark mode enhancements:
- Complete dark theme support across all modified components
- Smooth theme switching with no visual glitches
- Enhanced contrast and readability in dark mode
- Consistent color palette and gradient adaptations

 Responsive design:
- Mobile-optimized touch interactions and spacing
- Unified breakpoint behavior across all pages
- Enhanced button sizes and hover states for mobile

Files modified:
- templates/clients/list.html - Enhanced client list with animated badges and cards
- templates/clients/view.html - Improved client details with shimmer effects
- app/templates/tasks/edit.html - Professional markdown editor styling
- app/templates/tasks/create.html - Enhanced task creation form
- app/templates/tasks/list.html - Modern task cards with animations
- templates/projects/view.html - Consistent project task styling

This commit transforms the TimeTracker into a modern, professional application with exceptional user experience in both light and dark modes.
2025-09-08 12:09:58 +02:00
Dries Peeters
161bf2a2bd Merge pull request #43 from DRYTRIX/Feat-ImprovedTaskHandling
feat(tasks): add activity log, Markdown editor, and dark-mode polish
2025-09-08 08:10:05 +02:00
Dries Peeters
c297f1503b feat(tasks): add activity log, Markdown editor, and dark-mode polish
Backend
- Add TaskActivity model to record start/pause/review/complete/cancel/reopen
- Preserve started_at when reopening tasks; keep timestamps in app-local time
- Expose recent activities on task detail view

Migrations
- Add 004_add_task_activities_table (FKs + indexes)

Task detail (UI)
- Move Description into its own card and render as Markdown (markdown + bleach)
- Restyle Quick Actions to use dashboard btn-action styles
- Add custom confirmation modal + tooltips
- Recent Time Entries: use dashboard action buttons, add progressive “Show more/less” (10 per click)

Tasks list
- Fix dark mode for filter UI (inputs, selects, input-group-text, checkboxes)

Create/Edit task
- Integrate EasyMDE Markdown editor with toolbar
- Strong dark-theme overrides (toolbar, editor, preview, status bar, tokens)
- Prevent unintended side-by-side persistence
- Align “Current Task Info” dark-mode styles with task detail

CSS
- Add dark-mode tints for action buttons, tooltip light theme in dark mode
- Editor layout polish (padding, focus ring, gutters, selection)
- Quick actions layout: compact horizontal group

Deps
- Add: markdown, bleach

Run
- flask db upgrade  # applies 004_add_task_activities_table
2025-09-08 08:06:48 +02:00
Dries Peeters
6a0f3efe77 removed caddy 2025-09-05 15:09:25 +02:00
Dries Peeters
cc053d13eb Merge pull request #41 from DRYTRIX/develop
Develop
v1.5.0
2025-09-05 15:01:07 +02:00
Dries Peeters
9eef81d365 Merge pull request #40 from DRYTRIX/feat-ImproveTaskStateHandling
Update Github actions
2025-09-05 15:00:27 +02:00
Dries Peeters
e4a55860a3 Update Github actions 2025-09-05 15:00:08 +02:00
Dries Peeters
1a66b4d4b6 Merge pull request #39 from DRYTRIX/feat-ImproveTaskStateHandling
feat(tasks): allow reopening completed tasks and improve status handling
2025-09-05 14:48:17 +02:00
Dries Peeters
6d9c54b052 feat(tasks): allow reopening completed tasks and improve status handling
- Enable changing status from done back to todo/in_progress/review via edit form and status endpoints
- Clear completed_at when reopening; set/preserve started_at appropriately for in_progress
- Use localized timestamps via now_in_app_timezone() for updates [[memory:7499916]]
- Add “Reopen Task” quick action in task view for done tasks
- Update flash messages; no linter issues

Files:
- app/routes/tasks.py
- app/templates/tasks/view.html
2025-09-05 14:47:53 +02:00
Dries Peeters
fc5fd280b2 Merge pull request #38 from DRYTRIX/bug-FixRemoveRecentTimeEntry
fix(ui): unify Recent Time Entries actions and enable self-delete
2025-09-05 14:33:44 +02:00
Dries Peeters
9f58465c29 fix(ui): unify Recent Time Entries actions and enable self-delete
- Dashboard: switch Actions column to inline `btn-group` with `btn-action` styles
  (no stacking), preserving delete modal and permission checks.
- Tasks view: add Actions column with Edit/Delete, plus delete confirmation modal
  and JS; regular users can delete their own entries (or admins any).
- Timer page: align dynamic recent entries buttons to `btn-action` styles.

Server-side permissions already enforce owner-or-admin and block deleting active timers.
Files: app/templates/main/dashboard.html, app/templates/tasks/view.html, templates/timer/timer.html
2025-09-05 14:33:16 +02:00
Dries Peeters
47be788443 Merge pull request #37 from DRYTRIX/bug-FixCheckOverdueTasks
feat(tasks): add overdue filter; fix(ui): solid light-mode dropdown/n…
2025-09-05 10:27:50 +02:00
Dries Peeters
ae38d436d0 feat(tasks): add overdue filter; fix(ui): solid light-mode dropdown/navbar
- Backend:
  - Accept `overdue` query param in `tasks.list_tasks` and `tasks.my_tasks`
  - Filter tasks where `due_date < today` and status in ['todo','in_progress','review']
  - Use local date via `now_in_app_timezone().date()` to respect app timezone

- UI:
  - Add “Show overdue only” checkbox to `tasks/list.html` and `tasks/my_tasks.html`
  - Preserve checkbox state via template context

- Styles:
  - Enforce opaque white backgrounds for light-mode navbar and mobile navbar
  - Disable backdrop blur to prevent bleed-through
  - Normalize light-mode dropdown menu colors/borders for readability
  - Add light-theme fallback for `--bs-body-bg`
  - Tweak mobile navbar dropdown borders/shadows

Files:
- app/routes/tasks.py
- app/templates/tasks/list.html
- app/templates/tasks/my_tasks.html
- app/static/base.css
- app/static/mobile.css

Testing:
- Tasks and My Tasks: check “Show overdue only” → only overdue, non-completed/non-cancelled tasks appear
- Light mode: navbar and dropdowns show solid white backgrounds with clear borders/hover states
- Mobile: collapsed navbar menu is full-width, opaque, readable
2025-09-05 10:27:24 +02:00
Dries Peeters
34d4a38231 Merge pull request #36 from DRYTRIX/feat-DarkMode
feat(ui): dark mode fixes and Log Time UX aligned with invoices
2025-09-05 10:05:17 +02:00
Dries Peeters
66919c96b2 feat(ui): dark mode fixes and Log Time UX aligned with invoices
Make user dropdown fully dark; fix hover/divider; remove white overlay
Mobile dropdown respects dark vars; improve navbar-collapse bg/z-index
Improve action button grouping/contrast across pages
Add dark-mode variants for badges, lists, pagination, utilities
Refresh Log Time page: card header, mini-cards for Start/End, unified labels
Group Save/Clear actions; Back remains secondary
Per-user theme preference: model column + migration (003) + POST /auth/profile/theme
Base loads user theme (fallback to local/system); remove admin theme selector
2025-09-05 10:04:49 +02:00
Dries Peeters
b3e2d8419e Merge pull request #35 from DRYTRIX/feat-LayoutImprovements
feat(ui): unify page headers across app; add Buy Me a Coffee link
2025-09-04 09:53:33 +02:00
Dries Peeters
3376874ba0 feat(ui): unify page headers across app; add Buy Me a Coffee link
- Create and use shared page_header macro for consistent info headers
- Apply new header styling to:
  - Dashboard, Projects, Clients, Invoices (removed filter dropdown), Reports, Timer (manual)
  - System Info, Admin Users (list + form)
  - Profile, Edit Profile
  - Tasks (list, my tasks, overdue)
  - Analytics (desktop + mobile)
  - About, Help
- Add shared header/badge utilities in base.css for consistent spacing and badges
- Align summary cards and table/button styles with admin dashboard
- Footer: add “Buy me a coffee” link (https://buymeacoffee.com/DryTrix)
2025-09-04 09:52:09 +02:00
Dries Peeters
10346172ba Merge pull request #34 from DRYTRIX/develop
Develop
v1.4.0
2025-09-03 20:56:15 +02:00
Dries Peeters
1d29393008 Merge pull request #33 from DRYTRIX/feat-MissingReport
feat(reports): add Finished Tasks report with per-task hours and filters
2025-09-03 20:54:38 +02:00
Dries Peeters
079695d1b8 feat(reports): add Finished Tasks report with per-task hours and filters
- New route: GET /reports/tasks
  - Lists tasks with status "done" completed within the selected date range
  - Filters: project_id, user_id, start_date, end_date (defaults to last 30 days)
  - Aggregates hours per task from matching TimeEntry records
  - Shows assignee, completion date, total hours, and entry count per task
- UI: new template templates/reports/task_report.html with filters, summary cards, and results table
- Navigation: add “Finished Tasks Report” link under Project Reports on templates/reports/index.html
- Consistent styling and behavior with existing project/user reports
- No schema changes; login required
2025-09-03 20:54:13 +02:00
Dries Peeters
a835ec3f34 Merge pull request #32 from DRYTRIX/feat-CommonNameForUser
feat: add real name support and fix task detail error
2025-09-03 20:44:41 +02:00
Dries Peeters
7f8fd43eb5 feat: add real name support and fix task detail error
models/user: add nullable full_name and display_name property (fallback to username)
migrations: add 002_add_user_full_name to introduce users.full_name
auth/profile: show and allow editing full_name; persist on POST
templates:
use display_name across navbar, dashboard greeting, tasks (list/view/edit/my/overdue), projects view, reports (user/project), invoices (creator and generate-from-time), and admin (dashboard/users)
keep username where appropriate (e.g., read-only admin form field)
reports:
aggregate/group by display_name in summaries
CSV export writes display_name instead of username
projects: get_user_totals returns display names when available
main/dashboard: replace inline Jinja in script with data attribute flag to satisfy linter
tasks/view: remove Jinja desc() usage; iterate over pre-ordered time_entries from route and slice to 5
fixes jinja2 UndefinedError: 'desc' is undefined
2025-09-03 20:43:51 +02:00
Dries Peeters
041979e320 Merge pull request #31 from DRYTRIX/feat-CorrectBackupWorker
feat(backup): add robust backup/restore with migration-aware restores…
2025-09-03 20:18:25 +02:00
Dries Peeters
e0432a039f feat(backup): add robust backup/restore with migration-aware restores; polish Admin UI
Add app/utils/backup.py with create_backup/restore_backup
Include DB dump (SQLite file or pg_dump custom), settings.json, uploads/, manifest.json (incl. alembic_revision)
Use local-time timestamps in filenames and metadata
PostgreSQL: call pg_dump/pg_restore with host/port/user/db and PGPASSWORD
Restore runs migrations to head for older data compatibility
Admin
/admin/backup now generates and downloads a .zip archive
New /admin/restore (template: templates/admin/restore.html) for uploading and restoring backups
Refresh admin dashboard visuals (hero header, hover-lift cards, soft buttons), keep color scheme
Remove “System Overview” card from dashboard
CLI
Add flask backup_create and flask backup_restore <archive.zip>
Docker
Install PostgreSQL client tools; switch to PGDG postgresql-client-16 to match server v16
Docs/Config
No schema changes; retains existing settings and migrations
Notes:
Requires pg_dump/pg_restore inside the app image (now included)
Backups saved under project-root/backups and streamed to user on demand
2025-09-03 20:17:44 +02:00
Dries Peeters
645329c1e5 Merge pull request #30 from DRYTRIX/feat-ShowClientNameNextToProjectInSelector
feat(tasks): show client name next to project in task forms
2025-09-03 14:42:16 +02:00
Dries Peeters
a1703d6846 feat(tasks): show client name next to project in task forms
- Update app/templates/tasks/create.html and app/templates/tasks/edit.html
- Render project options as "Project (Client)" for clearer selection
- No backend changes required
2025-09-03 14:41:54 +02:00
Dries Peeters
cce66832db Merge pull request #29 from DRYTRIX/Bug-StartTimerFromTaskNotPossible
fix(timer): resolve 405 when starting a timer from tasks/project views
2025-09-03 14:32:56 +02:00
Dries Peeters
a5d3c0582c fix(timer): resolve 405 when starting a timer from tasks/project views
Use GET route `timer.start_timer_for_project` instead of POST-only `timer.start_timer`
in task and project templates. This fixes “405 Method Not Allowed” when starting a
timer from /tasks and /tasks/<id>, and from the project view.
2025-09-03 14:31:48 +02:00
Dries Peeters
47652ac1c0 Merge pull request #28 from DRYTRIX/Bug-TaskViewDropdownNotCorrect
fix(tasks,ui): correct Task View dropdown behavior and unify filter UI
2025-09-03 14:18:24 +02:00
Dries Peeters
64543d1550 fix(tasks,ui): correct Task View dropdown behavior and unify filter UI
- Ensure Task View dropdown shows correct options and preserves selected state
- Normalize dropdown/filter markup across tasks, clients, projects, reports, timer
- Update routes to pass/handle filter params and template context
- Align styles for dropdown spacing/alignment; improve mobile behavior
- Keep base layout consistent for shared components
2025-09-03 14:17:57 +02:00