1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# Changelog
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
- Initial packaged release of ShiftPlanner as a single-file, offline-capable
web application at `src/index.html`.
- Canonical file selected on measured evidence from five divergent copies:
`spaces/mindtech/downloads/shiftplanner-v12-ai.html`
(2,789 lines, 136,212 bytes, md5 `37207b2227899603f90c42e59ff1875a`).
It is the only copy that is a superset of both other v2.x builds and also
carries the AI advisor panel.
- Four non-canonical copies preserved unmodified in `archive/`, with flattened
names: `mindtech__shiftplanner.html`, `mindtech__downloads__shiftplanner.html`,
`mindtech__shiftplanner_v1.3.html`, `agando__shiftplanner_v1.3.html`.
- Documentation: `README.md`, `docs/USAGE.md`, `docs/CANONICAL.md`
(full measurement table, decision rationale, archive feature comparison and
the verified AI endpoint/model strings).
- `LICENSE` (source-available terms) and `VERSION`.
### Notes
- Feature set: staff register, shift templates, month calendar with day notes,
vacation/sick/day-off tracking, automatic plan generation with fairness and
rest rules, conflict detection, CSV export, JSON export/import, themes, and
an optional local-Ollama AI advisor.
- No external dependencies: 0 `<script src=…>`, 0 `<link>`, 0 `url(…)` assets.
- All application data is stored in browser `localStorage` under
`shiftplanner_v2`.
|