788bf3d619
rounding visibility in invoices and reports
2026-02-20 15:37:20 +02:00
35ec270e1d
rounding visibility indicators on entry rows
2026-02-20 15:36:07 +02:00
5a540261c8
time-of-day heatmap in reports patterns tab
2026-02-20 15:32:20 +02:00
3a58dd9476
project health badges and attention section
2026-02-20 15:32:14 +02:00
54b85f2a75
weekly comparison indicators and sparklines on dashboard
2026-02-20 15:32:07 +02:00
7bfe0915df
receipt thumbnails, lightbox, and file picker for expenses
2026-02-20 15:25:18 +02:00
143009651d
receipt lightbox component with zoom and focus trap
2026-02-20 15:23:11 +02:00
d16d6f3cd0
global shortcut for quick entry dialog
2026-02-20 15:20:27 +02:00
3902f3bd61
global quick entry dialog component
2026-02-20 15:18:34 +02:00
5fa4a9521f
timesheet row persistence and copy last week
2026-02-20 15:17:01 +02:00
a5b2e7d746
timesheet row persistence backend
2026-02-20 15:15:50 +02:00
2c31f94e8f
entry template management in settings
2026-02-20 15:10:48 +02:00
5eef5accf0
entry template picker and save-as-template in entries view
2026-02-20 15:09:37 +02:00
0a18c4cf2e
entry templates pinia store
2026-02-20 15:07:18 +02:00
5fff21fc96
entry templates CRUD backend
2026-02-20 15:06:50 +02:00
115b22ca47
cascade delete dialog for clients with dependency counts
2026-02-20 15:02:39 +02:00
e2d1b0aa4a
client cascade delete with dependency counts
2026-02-20 15:01:33 +02:00
a6d1c6fba5
smart timer safety net - save dialog on stop without project
2026-02-20 14:58:02 +02:00
68826529e4
timer save dialog for no-project and long-timer scenarios
2026-02-20 14:56:17 +02:00
0ff3260e8d
use batch save for invoice items
2026-02-20 14:55:17 +02:00
882fee1209
batch invoice items save with transaction
2026-02-20 14:54:37 +02:00
ad8184bb65
independent try/catch per onboarding detection call
2026-02-20 14:47:26 +02:00
79211cac83
standardize error handling across all stores
2026-02-20 14:46:56 +02:00
c6e241ba09
use unified error handler in entries store
2026-02-20 14:43:10 +02:00
7bb62ee6aa
unified error handler with retry for transient errors
2026-02-20 14:42:30 +02:00
039cfd518a
persistent notifications toggle in settings
2026-02-20 14:40:50 +02:00
4e1ca8fd27
toast undo button and hover/focus pause
2026-02-20 14:38:34 +02:00
98b78106d2
toast auto-dismiss with undo and pause support
2026-02-20 14:38:08 +02:00
0f529793a3
enhancement round 2 implementation plan - 34 tasks
...
Phase 1: Toast auto-dismiss/undo, unified error handling, onboarding
resilience, invoice batch save, smart timer safety net.
Phase 2: Client cascade delete, entry templates, timesheet persistence,
global quick entry, receipt management.
Phase 3: Dashboard comparison, project health, heatmap, rounding
visibility, complete export with auto-backup.
2026-02-20 14:29:25 +02:00
5713a9d50f
enhancement round 2 design - 15 feature proposals
...
Covers smart timer safety net, toast undo system, unified error
handling, onboarding resilience, invoice save reliability, global
quick entry, entry templates, timesheet persistence, client cascade,
receipt management, weekly comparison, project health cards, time
heatmap, rounding preview, and export scheduling. All features
designed for WCAG 2.2 AAA compliance.
2026-02-20 14:22:01 +02:00
c187c67b06
add tour store for guided walkthrough state
2026-02-20 09:36:26 +02:00
9f44a1a697
tidy up project structure and normalize formatting
2026-02-19 22:43:14 +02:00
99be86a860
mini timer renders via window label instead of hash routing
...
The mini timer window was blank because hash-based routing
(createWebHashHistory) doesn't work with Tauri's WebviewUrl path.
Now App.vue detects the mini timer by checking getCurrentWindow().label
=== 'mini-timer' and renders the MiniTimer component directly,
bypassing the router entirely.
2026-02-18 15:26:44 +02:00
813411078d
mini timer window blank due to hash routing mismatch
...
The app uses createWebHashHistory but the mini timer window was
opened with WebviewUrl::App("/mini-timer") which sets the URL path,
not the hash fragment. Vue Router never matched the route, so the
Dashboard rendered in a 300x64 window (appearing blank). Now loads
root URL and sets window.location.hash via eval. Also shows/focuses
the main window when closing the mini timer.
2026-02-18 15:23:20 +02:00
ffbbfe0df1
load invoice templates from JSON files via backend
...
Templates are now loaded dynamically from data/templates/*.json
via the get_invoice_templates Tauri command instead of being
hardcoded in TypeScript. Preview and PDF renderer switch on
template.layout instead of template.id, allowing custom templates
to reuse built-in layouts with different colors.
2026-02-18 15:17:54 +02:00
b722ee684c
load invoice templates from JSON files in data/templates directory
2026-02-18 15:12:30 +02:00
32fc45f111
delete invoice_items before invoice to prevent FK constraint failure
2026-02-18 15:07:43 +02:00
aa031f6103
make template picker full-screen with fixed positioning so buttons are visible
2026-02-18 15:05:02 +02:00
391c4cf49c
rewrite InvoicePreview with 15 unique typographic layouts
2026-02-18 14:50:49 +02:00
e8a57397c0
rewrite PDF renderer with 15 unique typographic layouts
2026-02-18 14:45:38 +02:00
85aec09d1a
add two-step invoice flow with full-screen template picker
2026-02-18 14:43:55 +02:00
b78c796d55
update invoicePdf wrapper with new default template ID
2026-02-18 14:41:23 +02:00
2278534afe
rewrite invoice template configs with design-doc IDs and colors
2026-02-18 14:39:01 +02:00
6320b6d13c
add template_id to Invoice interface and updateInvoiceTemplate action
2026-02-18 14:38:14 +02:00
a0f4815103
add template_id column to invoices table and update_invoice_template command
2026-02-18 14:37:26 +02:00
dfbeb1a57f
add invoice templates v2 implementation plan
2026-02-18 14:32:38 +02:00
f1121b5a02
add invoice templates v2 complete redesign design doc
2026-02-18 14:28:41 +02:00
098751b741
integrate template picker into invoice create and preview views
2026-02-18 13:35:11 +02:00
2aa3b2950b
add business identity settings for invoice branding
2026-02-18 13:34:44 +02:00
c63e8577d6
add InvoicePreview.vue with all 7 header styles and 5 table styles
2026-02-18 13:30:27 +02:00