From bf1428c959da971c1807a5cf11e25caa52ee9e2d Mon Sep 17 00:00:00 2001 From: callumalpass Date: Fri, 5 Jun 2026 10:16:05 +1000 Subject: [PATCH] release 4.10.1 --- docs/privacy.md | 6 ++-- docs/releases.md | 1 + docs/releases/4.10.1.md | 18 ++++++++++++ docs/releases/unreleased.md | 18 ------------ manifest.json | 2 +- package-lock.json | 4 +-- package.json | 2 +- .../calendarMaterializedOccurrences.test.ts | 29 +++++++++++++++++-- versions.json | 3 +- 9 files changed, 56 insertions(+), 27 deletions(-) create mode 100644 docs/releases/4.10.1.md diff --git a/docs/privacy.md b/docs/privacy.md index 83b62869..d9db3c34 100644 --- a/docs/privacy.md +++ b/docs/privacy.md @@ -1,6 +1,6 @@ # TaskNotes Privacy Policy -Last updated: February 21, 2026 +Last updated: June 4, 2026 ## Overview @@ -17,11 +17,12 @@ Plugin settings are stored in Obsidian's local plugin configuration. ## Optional Network Features -TaskNotes is local-first. Network requests occur only when you enable features that require them. +TaskNotes is local-first. Network requests occur only for enabled features that require them. Some enabled integrations perform periodic background refreshes, such as calendar provider sync and ICS subscription updates. Optional network features: +- Release checks: when enabled, TaskNotes checks GitHub once on startup for newer compatible TaskNotes releases. This is enabled by default and can be disabled in TaskNotes settings. - OAuth calendar integration (Google/Microsoft): fetches and updates calendar events through provider APIs. - ICS subscriptions: fetches events from configured ICS URLs. - Webhooks: sends event payloads to webhook endpoints you configure. @@ -37,6 +38,7 @@ Optional network features: - Google APIs: https://policies.google.com/privacy - Microsoft APIs: https://privacy.microsoft.com/privacystatement +- GitHub: https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement - Any ICS host or webhook endpoint you configure ## What TaskNotes Does Not Do diff --git a/docs/releases.md b/docs/releases.md index 696fb025..3636533c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -6,6 +6,7 @@ Welcome to the TaskNotes release notes. Here you can find detailed information a ### Version 4.x (Current) +- [4.10.1](releases/4.10.1.md) - [4.10.0](releases/4.10.0.md) - [4.9.2](releases/4.9.2.md) - [4.9.1](releases/4.9.1.md) diff --git a/docs/releases/4.10.1.md b/docs/releases/4.10.1.md new file mode 100644 index 00000000..a882aeb1 --- /dev/null +++ b/docs/releases/4.10.1.md @@ -0,0 +1,18 @@ +# TaskNotes 4.10.1 + +## Added + +- Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. +- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request. +- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap. + +## Fixed + +- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. +- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. +- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. +- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. +- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. +- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. +- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. +- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this. diff --git a/docs/releases/unreleased.md b/docs/releases/unreleased.md index 74370699..121110a0 100644 --- a/docs/releases/unreleased.md +++ b/docs/releases/unreleased.md @@ -31,21 +31,3 @@ When a change has user-facing documentation, include a canonical tasknotes.dev l ``` --> - -## Added - -- Added an enabled-by-default startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. -- Added translations for the new startup release-check setting and update notice. -- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request. -- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @martin-forge for identifying the API/MCP gap. - -## Fixed - -- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. -- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. -- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. -- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. -- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. -- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. -- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. -- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this. diff --git a/manifest.json b/manifest.json index 181494f8..f6925817 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "tasknotes", "name": "TaskNotes", - "version": "4.10.0", + "version": "4.10.1", "minAppVersion": "1.12.2", "description": "Note-based task management with calendar, pomodoro and time-tracking integration.", "author": "Callum Alpass", diff --git a/package-lock.json b/package-lock.json index 21bede5b..efde6e90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tasknotes", - "version": "4.10.0", + "version": "4.10.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tasknotes", - "version": "4.10.0", + "version": "4.10.1", "license": "MIT", "dependencies": { "@codemirror/view": "^6.38.6", diff --git a/package.json b/package.json index 7c23ef39..4a1cc822 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tasknotes", - "version": "4.10.0", + "version": "4.10.1", "description": "Note-based task management with calendar, pomodoro and time-tracking integration.", "main": "main.js", "scripts": { diff --git a/tests/unit/bases/calendarMaterializedOccurrences.test.ts b/tests/unit/bases/calendarMaterializedOccurrences.test.ts index 5492ed2e..881fa25c 100644 --- a/tests/unit/bases/calendarMaterializedOccurrences.test.ts +++ b/tests/unit/bases/calendarMaterializedOccurrences.test.ts @@ -1,3 +1,8 @@ +jest.mock("../../../src/utils/helpers", () => ({ + ...jest.requireActual("../../../src/utils/helpers"), + generateRecurringInstances: jest.fn(), +})); + import { generateCalendarEvents, getTargetDateForEvent, @@ -5,8 +10,12 @@ import { } from "../../../src/bases/calendar-core"; import type TaskNotesPlugin from "../../../src/main"; import { formatDateForStorage } from "../../../src/utils/dateUtils"; +import { generateRecurringInstances } from "../../../src/utils/helpers"; import { TaskFactory } from "../../helpers/mock-factories"; +const mockedGenerateRecurringInstances = + generateRecurringInstances as jest.MockedFunction; + function createPlugin(): TaskNotesPlugin { return { priorityManager: { @@ -22,6 +31,10 @@ function localDate(year: number, monthIndex: number, day: number): Date { return new Date(year, monthIndex, day); } +function localNoonDate(year: number, monthIndex: number, day: number): Date { + return new Date(year, monthIndex, day, 12); +} + function virtualOccurrenceDates(events: CalendarEvent[]): string[] { return events .filter( @@ -37,8 +50,20 @@ function virtualOccurrenceDates(events: CalendarEvent[]): string[] { describe("calendar materialized occurrences", () => { const plugin = createPlugin(); - const start = localDate(2026, 5, 1); - const end = localDate(2026, 5, 4); + const start = localNoonDate(2026, 5, 1); + const end = localNoonDate(2026, 5, 4); + + beforeEach(() => { + mockedGenerateRecurringInstances.mockReturnValue([ + localNoonDate(2026, 5, 1), + localNoonDate(2026, 5, 2), + localNoonDate(2026, 5, 3), + ]); + }); + + afterEach(() => { + mockedGenerateRecurringInstances.mockReset(); + }); it("coalesces virtual recurrence events when a materialized occurrence exists", async () => { const parent = TaskFactory.createRecurringTask("FREQ=DAILY;INTERVAL=1", { diff --git a/versions.json b/versions.json index 1281d962..ca6418f1 100644 --- a/versions.json +++ b/versions.json @@ -25,5 +25,6 @@ "4.9.0": "1.12.2", "4.9.1": "1.12.2", "4.9.2": "1.12.2", - "4.10.0": "1.12.2" + "4.10.0": "1.12.2", + "4.10.1": "1.12.2" } \ No newline at end of file