Skip to content

Commit 3b61bf9

Browse files
Merge pull request #3 from cpt-kernel-afk/docs/release-0.2.0
Document pausable timers and bump version to 0.2.0
2 parents 3c34caf + df1ed48 commit 3b61bf9

2 files changed

Lines changed: 43 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
66

77
## [Unreleased]
88

9+
## [0.2.0]
10+
11+
### Added
12+
- Pausable timers: multiple timer sessions can stay open at once, with exactly
13+
one running and the rest on hold.
14+
- Pause / resume controls per timer, plus an **On hold** section on the
15+
dashboard.
16+
17+
### Changed
18+
- Starting or resuming a timer now puts the currently running timer **on hold**
19+
(paused) instead of stopping it, so switching projects keeps prior sessions
20+
open. Starting a project that already has an open session resumes it rather
21+
than creating a duplicate.
22+
- `TimeEntry` now tracks worked time across run/pause segments via new fields
23+
`status`, `accumulated_minutes` and `segment_started_at`; `duration_minutes`
24+
is the worked total and excludes paused gaps.
25+
926
## [0.1.0] - Initial release
1027

1128
### Added
@@ -24,5 +41,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
2441
- Test suite covering models, auth gating, timer flow, redirect safety, and
2542
report generation.
2643

27-
[Unreleased]: https://github.com/c4pt4in/timetracker/compare/v0.1.0...HEAD
44+
[Unreleased]: https://github.com/c4pt4in/timetracker/compare/v0.2.0...HEAD
45+
[0.2.0]: https://github.com/c4pt4in/timetracker/compare/v0.1.0...v0.2.0
2846
[0.1.0]: https://github.com/c4pt4in/timetracker/releases/tag/v0.1.0

README.md

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ up` away from running.
1717
marker and an optional hourly rate.
1818
- **Manual time entries** — pick a date, start and end time; duration is
1919
computed automatically.
20-
- **Live timer** — one-click start/stop on the dashboard, with a live JS counter
21-
in the navbar. Only one timer runs at a time; starting a new one stops the
22-
previous.
20+
- **Live timer with pause/hold** — start a timer on any project from the
21+
dashboard, with a live JS counter. Only one timer runs at a time; starting or
22+
resuming another automatically puts the running one **on hold** instead of
23+
stopping it, so you can switch between projects with a single click and resume
24+
later. Each timer has pause / resume / stop controls, and worked time is
25+
tracked across segments (paused gaps are excluded).
2326
- **Dashboard** — today / this week / this month totals per project, plus the
2427
most recent entries.
2528
- **PDF report** — generated server-side with WeasyPrint. Filter by date range
@@ -98,9 +101,12 @@ full list of variables; the most important ones:
98101
### Live timer
99102

100103
From the dashboard, click **Start Timer** on any project card. The timer ticks
101-
live in the navbar; click **Stop & Save** to write the entry, or **Discard** to
102-
throw it away. Starting a timer on a different project automatically stops the
103-
running one.
104+
live; use **Pause** to put it on hold (it stops counting but stays open),
105+
**Resume** to continue, **Stop & Save** to write the entry, or **Discard** to
106+
throw it away. Starting or resuming a timer on another project automatically
107+
puts the currently running one on hold, so you can hop between projects with a
108+
single click. Held timers are listed in an **On hold** section on the
109+
dashboard; only one timer runs at a time.
104110

105111
### Manual entry
106112

@@ -206,12 +212,18 @@ flow, redirect safety, and PDF/CSV report generation.
206212

207213
- **Project**: `name` (unique), `description`, `color` (validated hex),
208214
`hourly_rate` (optional), `is_archived`, `created_at`
209-
- **TimeEntry**: `project` (FK, CASCADE), `date`, `start_time`, `end_time`,
210-
`duration_minutes` (auto-calculated when both timestamps set),
211-
`description`, `created_at`
212-
213-
A running live timer is simply a `TimeEntry` with `start_time` set and
214-
`end_time = NULL`.
215+
- **TimeEntry**: `project` (FK, CASCADE), `date`, `start_time` (first start),
216+
`end_time` (final stop), `status` (`running` / `paused` / `completed`),
217+
`accumulated_minutes` (worked time from completed segments),
218+
`segment_started_at` (start of the live segment; `NULL` while paused),
219+
`duration_minutes` (worked total, excludes paused gaps), `description`,
220+
`created_at`
221+
222+
An open timer is a `TimeEntry` with `end_time = NULL` and a `status` of
223+
`running` or `paused`. While running, worked time is `accumulated_minutes` plus
224+
the live segment since `segment_started_at`; pausing banks the live segment
225+
into `accumulated_minutes`. Stopping writes the worked total into
226+
`duration_minutes`. At most one entry is `running` at a time.
215227

216228
## Troubleshooting
217229

0 commit comments

Comments
 (0)