summaryrefslogtreecommitdiff
path: root/CHANGELOG.md
blob: 425418cc7975aa4069060e4a90d4801fb3f445f5 (plain)
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`.