aboutsummaryrefslogtreecommitdiff
path: root/CHANGELOG.md
diff options
context:
space:
mode:
Diffstat (limited to 'CHANGELOG.md')
-rw-r--r--CHANGELOG.md25
1 files changed, 25 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3babe97..425418c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,31 @@ All notable changes to this product tree are recorded here.
This file describes the packaged product, not the history of the five source
copies (that history is documented in `docs/CANONICAL.md`).
+## 1.0.1 — 2026-11-09
+
+Seven defects found by driving the app in Chromium, plus three data-integrity guards.
+
+- **Settings never opened**: `openSettings()` called `openModal('settingsModal')`, whose hook called
+ `openSettings()` again — `RangeError: Maximum call stack size exceeded` on every click. The cycle is
+ broken at the source; the hook is the single caller.
+- **"+ Worker" overwrote the last person you edited.** `openWorkerModal()` never cleared `#workerId`,
+ and the header button opened the modal directly, bypassing the reset. Adding a worker now starts blank.
+- **Dates were off by one west of UTC**: `getPrevDay()` built a local-noon `Date` and formatted it with
+ `toISOString()`. Day arithmetic is done on the date string in local time; verified in Pacific/Auckland,
+ America/Los_Angeles and UTC, including a month boundary.
+- **Overlaps were never detected.** The check only looked at the previous calendar day, so 22:00–06:00
+ followed by 02:00–10:00 the same day passed. Shifts are compared as absolute intervals now, including
+ overnight spill into the next day.
+- **The generator sliders did not persist**: conflict detection kept using 5/11 while the wizard showed
+ the new values. Both are written to `settings` on change and before generating.
+- **CSV export could execute formulas.** Cells are quoted with doubled inner quotes, and a leading `'`
+ is added to any value starting with `= + - @`, tab or CR.
+- **The header never wrapped**: at 390 px the document became 1139 px wide. It wraps now; 390 px stays 390 px.
+- Data integrity: an unparseable saved plan is copied to `shiftplanner_v2_recovery_<timestamp>` instead of
+ being silently overwritten, wrong-typed fields are normalised instead of blanking the page, unknown
+ top-level fields survive a save, `saveToStorage()` is guarded, and a `storage` listener reacts to
+ another tab.
+
## [1.0.0] - 2026-11-09
### Added