Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## 0.3.0-rc.18

### Fixed

- TaskNotes #2396: moved native recurring calendar occurrences retain their original rule-date identity for IDs, completion/skip lookup, spans and materialized-child suppression. Their original date is not projected again; moves onto another rule date keep the two occurrences distinct. Recorded history and Google moved-date behavior are preserved.
- Calendar edit plans capture and preserve the mapped `recurrence_original_date`, delete it on return to the original day or a series/DTSTART edit, and anchor DTSTART-less rules to the old scheduled date and clock rather than the moved placement. Legacy unmarked off-pattern and completion-anchored tasks do not acquire guessed identities.

### Added

- Optional `recurrenceOriginalDate` field mapping (default `recurrence_original_date`), task/schema support and strict date normalization, with fallback for older saved mappings.
- Packaged moved-occurrence regression fixtures covering projection, mapped edits, history, materialization and timed/all-day spans.

## 0.3.0-rc.17

### Added
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,31 @@ const plan = planCalendarEdit({
than being projected on each recurrence date. Materialized children suppress
virtual parent occurrences; supply `materializedOccurrences` for children outside
the visible task set, keyed by resolved parent task ID.
- Native scheduled-anchor moves use `recurrence_original_date` as the pending
occurrence's identity, while `scheduled` remains its placement. Forward both
fields and `recurrence_anchor` in host projection adapters, alongside completion/
skip history and Google moved-date fields. IDs, completion/skip lookup, spans and
materialized-child suppression use the original identity; a move onto another
rule date leaves that real occurrence distinct. Unmarked legacy off-pattern
dates are not assigned guessed identities. Completion-anchor tasks ignore this
marker. Recorded history remains available when its moved placement is outside
the range.
- `FieldMapping.recurrenceOriginalDate` defaults to `recurrence_original_date`,
including for older mappings that omit the key. Mapping accepts only real,
strict `YYYY-MM-DD` identities. Calendar moves preserve this identity across
repeated moves, remove it on return to its original day, and pin missing DTSTART
to the old scheduled date/clock. A series/DTSTART clock edit clears the marker.
This is a model extension; it does not change the pinned spec contract version.
- Edit plans mirror plugin gestures: next-occurrence drops reschedule `scheduled`;
pattern drops change only DTSTART's clock (preserving its date); recorded drops
change the scheduled clock without moving its date. No gesture materializes a
note. Pattern all-day/timed changes leave `scheduled` independent. Recurring
spans are read-only. Resizes change only the estimate, not `scheduled`/`due`,
except time-entry resizes, which replace their range. `clearedInstances` reports
completion/skip dates removed by a next-occurrence reschedule, for confirmation.
- Shared fixtures include `fixtures/calendar/moved-occurrences.json`. Raw JSON
edits use `expectedUnsetProperties` to name updates whose value is `undefined`;
the typed `calendar/fixtures` export expands these deletions automatically.
- The index caches eight ranges per task by default. Supply immutable task objects
or call `upsert` with a changed revision after mutation. `setTasks` preserves
cached unchanged objects and updates order/membership; `remove` and materialized
Expand Down
Loading
Loading