Commit graph

2148 commits

Author SHA1 Message Date
callumalpass
2f53847607 fix(#1421): Natural language parser now processes both scheduled and due date triggers
Previously, entering text like "Task scheduled for tomorrow due next week" in the
New Task dialog would only capture one of the dates. The parser correctly recognized
both triggers but returned early after processing the first match.

The fix removes the early return and continues processing all trigger patterns,
allowing users to set both scheduled and due dates in a single natural language input.
2026-01-04 11:30:19 +11:00
callumalpass
13a91f5bca test(#1425): Add skipped tests for calendar auto-refresh on time entry/pomodoro changes
Documents expected behavior for Issue #1425 feature request:
- Calendar should refresh immediately when time entries are saved
- Calendar should refresh immediately when Pomodoro session completes
- Added prerequisite test for time entry toggle visibility

Tests are marked as .fixme pending implementation of the feature.
2026-01-04 11:25:02 +11:00
callumalpass
6f917b1eef fix(#1419): Custom statuses and priorities now save correctly in settings
Text input fields used 'change' event which only fires on blur, so values
were lost if modal closed without blurring. Changed to 'input' event for
immediate value capture, and added hide() method to flush pending debounced
saves when settings modal closes.
2026-01-04 10:03:13 +11:00
callumalpass
62eb7d0e53 test: Add skipped tests documenting Issue #1423 project UI refresh bug
Documents the bug where project cards don't refresh when subtasks are removed.
The deleted subtask remains visible in the expanded subtask list, and if the
last subtask is removed the parent still renders as a project until a full
view reload.

Root cause: ProjectSubtasksService uses a 30-second TTL-based cache
(INDEX_TTL = 30000) with no event-driven invalidation when subtasks
are deleted or their projects field is modified.

Tests cover:
- Subtask should disappear from expanded list when deleted
- Parent should revert to normal card when last subtask is deleted
- Project index should invalidate when subtask projects field is modified
- Task list view should refresh when subtask is deleted (cross-view issue)

Issue #1423
2026-01-04 09:59:41 +11:00
callumalpass
566a721a81 fix(#1422): Tags with dashes now parsed correctly
Tags like #my-tag were truncated to #my because the TAG_PATTERN regex
didn't include hyphens. Updated pattern from /#[\w/]+/g to /#[\w/-]+/g.

Fixes #1422
2026-01-04 09:57:47 +11:00
callumalpass
59d23c619a fix(#1424): Create New Task command now uses default folder setting
Introduce 'modal-inline-creation' creationContext to distinguish
the "Create New Inline Task" command from the standard "Create New Task"
command. This fixes a regression from #1334 where both commands
incorrectly used inlineTaskConvertFolder.

Folder behavior is now correctly:
- manual-creation (Create New Task) → tasksFolder (default folder)
- modal-inline-creation (Create New Inline Task) → inlineTaskConvertFolder
- inline-conversion (checkbox conversion) → inlineTaskConvertFolder

Fixes #1424
2026-01-04 09:52:13 +11:00
callumalpass
d7d01819d2 test(#1421): Expand tests with settings and trigger order documentation
Add tests covering:
- nlpDefaultToScheduled setting interaction with explicit triggers
- Trigger processing loop order (due checked before scheduled)
- Alternative trigger words (deadline, by, start on, work on)
- Current buggy behavior documentation test
2026-01-04 09:40:25 +11:00
callumalpass
864570c1bb test: Add skipped tests documenting Issue #1424 folder selection bug
Add two skipped unit tests documenting the regression introduced by #1334:

1. "Create New Task" command now incorrectly uses inlineTaskConvertFolder
   (with {{currentNotePath}}) instead of the configured tasksFolder setting.
   Tasks are created in the active folder rather than the default folder.

2. Verify that inline-conversion context should still use inlineTaskConvertFolder
   with {{currentNotePath}} support - this behavior is correct.

The root cause is that PR #1334 grouped "manual-creation" context (used by
TaskCreationModal for both Create New Task and Create New Inline Task commands)
with "inline-conversion" for folder selection. The fix needs to distinguish
between the two commands or introduce a new creation context.

Relates to #1424
2026-01-04 09:38:33 +11:00
callumalpass
d1a36ca4c7 test: Add skipped tests documenting Issue #1422 tags with dashes bug
Tags containing dashes (e.g., #my-tag) are incorrectly parsed due to
TAG_PATTERN using /#[\w/]+/g which doesn't include hyphens. The pattern
only matches up to the first dash, so #my-tag becomes #my.

See #1422
2026-01-04 09:37:13 +11:00
callumalpass
9347063300 test: Add skipped tests documenting Issue #1419 settings persistence bug
Add Playwright tests that document the bug where custom task statuses
and priorities don't persist after closing and reopening settings.
User reports that after updating to 4.2.0, adding new custom statuses
or priorities results in values being lost when settings are closed.

Tests are marked as skipped pending investigation of root cause.
2026-01-03 21:11:39 +11:00
callumalpass
258152b5b3 test: Add tests documenting Issue #1418 swimlane task count bug
Documents the bug where swimlanes show incorrect task counts.
Includes tests for:
- Property lookup case sensitivity (potential root cause)
- Swimlane distribution with missing property values
- Scenario matching the user's report (23 tasks -> 2 visible)
- Proposed fix for case-insensitive property lookup

See #1418
2026-01-03 21:11:32 +11:00
callumalpass
f7c1f36ff1 test: Add skipped tests documenting Issue #1421 dual dates bug
When using natural language to set both scheduled and due dates (e.g.,
"Task scheduled for tomorrow due next week"), only the first date trigger
is processed due to an early return in parseUnifiedDatesAndTimes().

Root cause identified at NaturalLanguageParser.ts:749 - the function
returns early after processing the first explicit trigger match.
2026-01-03 21:10:38 +11:00
callumalpass
f969fd8c17 feat(api): add Calendars API endpoints for calendar provider info and events
Adds CalendarsController with 5 new endpoints:
- GET /api/calendars - overview of all calendar sources
- GET /api/calendars/google - Google Calendar connection and calendars
- GET /api/calendars/microsoft - Microsoft Calendar connection and calendars
- GET /api/calendars/subscriptions - ICS subscription details
- GET /api/calendars/events - all events with optional date range filter
2026-01-02 11:32:58 +11:00
callumalpass
62c1f7b7d5 test: Add skipped tests documenting Issue #1285 calendar flickering bug
Documents the root cause analysis and expected behavior for the calendar
view flickering issue. Tests cover the debounce mechanism, immediate
update flag, config change detection, and render locking that prevent
excessive re-renders.

The tests are skipped because the actual flickering behavior requires
visual/E2E testing, but the underlying mechanisms are documented.
2026-01-02 11:14:43 +11:00
callumalpass
9c8ca0ab27 test: Add skipped tests documenting Issue #1288 calendar formula bug
Calendar start/end date property dropdowns filter out formula properties,
unlike other dropdowns (title property, kanban swimlane) that allow them.
2026-01-02 11:09:27 +11:00
callumalpass
dc8dda9b25 test: Add skipped tests documenting Issue #1293 feature request
Adds Playwright tests for the incomplete task rollover feature.
These tests document the expected behavior and will pass once
the feature is implemented.
2026-01-02 11:00:51 +11:00
callumalpass
89b9171400 test: Add skipped tests documenting Issue #1299 feature request
Add e2e tests for the feature request to create a new command that
combines "Create or open task" with automatic time tracking start.

Tests cover:
- Command existence check
- Time tracking start after selecting existing task
- Time tracking start after creating new task
- Bonus feature: optional time entry description prompt

Tests are marked as skipped until the feature is implemented.
2026-01-02 10:49:54 +11:00
callumalpass
1ac74a5042 test: Add failing test for Issue #1411 agenda sort bug (duplicate of #1331)
Issue #1411 reports that the Agenda view ignores sort configuration,
keeping tasks sorted alphabetically by title instead of by status/priority.

This is a duplicate of Issue #1331. Added a `test.fixme` test that:
- Opens the agenda-default view
- Verifies tasks are incorrectly sorted alphabetically
- Documents the expected behavior (sort by status then priority)
2026-01-02 10:45:50 +11:00
callumalpass
891d361eb6 fix(modal): correct vim insert mode activation in task creation modal (#1410)
The 4.2.0 implementation used an incorrect path to access the CodeMirror
vim adapter. This fix:
- Uses correct path (editor.cm.cm) to access the CM5 adapter
- Adds fallback to activeCM for compatibility
- Adds 50ms delay to ensure vim extension has initialized

Thanks to @Leo310 for the feature request and testing.
2026-01-02 08:59:08 +11:00
callumalpass
5689782eeb update release docs 2026-01-02 08:38:48 +11:00
callumalpass
121013616a release 4.2.0
Added:
- Korean language support (1911 localization keys)
- Obsidian 1.11.0 API features with backwards compatibility
- shortYear template variable for custom filename/folder templates
- Option to prevent auto-creation of default Base view files
- Shift+click on status icon to cycle backwards
- Vim insert mode auto-start in task creation modal
- Button tooltips to calendar view toolbar and task modal
- Settings sync across devices via Obsidian Sync
- Kanban view option for status icons in column headers only
- Calendar view option to span tasks between scheduled and due dates
- currentNotePath support for "Create new inline task" command
- Option to open Pomodoro timer in mobile sidebar
- Option to use ICS event end time as task due date
- Option to use task duration for ICS calendar export

Fixed:
- Title sanitization when "Store Task Title in Filename" is disabled
- Duplicate task entries in Agenda view
- timeEstimateCategory formula for new tasks
- Bases views resetting to Calendar view
- Overdue strikethrough on completed tasks
- Calendar view crash with invalid date formats
- Today column styling in calendar week/day views
- Drag-and-drop in Kanban view on mobile
- Pomodoro task menu not showing new tasks
- "Unsaved Changes" popup appearing randomly
- Kanban swimlane column assignment with formula grouping
- Date context menu time preservation with increment options
- v3 saved views export to Bases format
- Due date dragging in calendar view
- Calendar view responsiveness for user interactions
- Pomodoro timer button visibility
- Views in pop-out windows (drag-and-drop, context menus, etc.)
- "Convert current note to task" default values
- Blocking view error with single dependency
- Missing navigation link to Default Base Templates
- "Go to today's note" command in positive UTC offset timezones
2026-01-02 08:34:00 +11:00
callumalpass
2a70cf0b90 feat(#1108): Add option to use task duration for ICS export event length
When enabled, exported calendar events use scheduled date + time estimate
as DTSTART/DTEND instead of using due date for DTEND.

This aligns with GTD workflows where scheduled + duration represents work
planning, while due date represents deadlines. The feature is off by default
to preserve existing behavior.

- Add useDurationForExport setting to ICSIntegrationSettings
- Add ICSExportOptions interface for export configuration
- Update CalendarExportService methods to accept duration option
- Add UI toggle in Settings → Integrations → Automatic ICS Export
- Add English translation keys for the new setting
- Update and enable tests for the feature
2026-01-01 20:41:02 +11:00
callumalpass
79a4839629 test: Add skipped tests documenting Issue #1109 link preservation bug
Instant Task Convert destroys markdown links and wikilinks when converting
checklist items to TaskNotes. The sanitizeForFilename function removes
brackets [] which breaks link syntax like [text](url) and [[note]].

Tests document:
- How markdown link URLs are mangled (brackets/slashes stripped)
- How wikilink syntax is destroyed (double brackets stripped)
- How wikilinks with aliases lose their path structure

Skipped tests outline expected behavior after fix:
- Extract link display text for title, preserve full links in body
- Handle both markdown links and wikilinks
2026-01-01 19:37:52 +11:00
callumalpass
c670e37c9c test: Add skipped tests documenting Issue #1108 ICS export duration feature
Document the feature request to use task timeEstimate (duration) for
calculating ICS event end time instead of using due date. Tests
document current behavior and expected new behavior when feature
is implemented.
2026-01-01 19:35:27 +11:00
callumalpass
6bdc3d6e64 feat(i18n): Add translations for mobile sidebar and ICS end time settings
- Add mobileSidebar translations (name, description, tab, left, right) for all 8 locales
- Add useICSEndAsDue translations (name, description) for all 8 locales
- Updates German, Spanish, French, Japanese, Korean, Portuguese, Russian, and Chinese
2026-01-01 19:33:58 +11:00
callumalpass
cb8c418510 feat(#1220): Add optional toggle to use ICS event end time as task due date
Adds a new setting 'useICSEndAsDue' in Calendar Subscriptions settings that,
when enabled, sets the due date of tasks created from ICS events to the
event's end time.

- For timed events: uses the actual end time (YYYY-MM-DDTHH:mm)
- For all-day events: uses the event start date (ICS spec has DTEND as next day)
- For events without end time: no due date is set
- User overrides take precedence over computed values
- Defaults to false to preserve existing behavior

Closes #1220
2026-01-01 19:28:10 +11:00
callumalpass
9510609933 feat(i18n): Add Korean language support
- Add complete Korean (한국어) translation with 1911 keys
- Add Korean to language selector in all locale files
- Update i18n manifest and state for new locale
2026-01-01 19:03:45 +11:00
callumalpass
29fd443ac6 fix(#1223): Go to today's note respects timezone in positive UTC offsets
Users in timezones ahead of UTC (Japan, Australia, NZ, China, etc.)
experienced the Go to today's note command opening the previous
days note during early morning hours.

Root cause: navigateToCurrentDailyNote() used new Date() which was
then passed to convertUTCToLocalCalendarDate(). That function extracts
UTC date components (getUTCFullYear/Month/Date), but the input was
a current-moment Date, not a UTC-anchored date. When the local day
differs from UTC day (e.g., 8 AM in Japan is 11 PM previous day UTC),
the wrong day was extracted.

Fix:
- Use getTodayLocal() which correctly extracts local date components
- Add isAlreadyLocal option to navigateToDailyNote() to skip the
  unnecessary (and incorrect) UTC-to-local conversion

Fixes #1223
2026-01-01 18:10:13 +11:00
callumalpass
8ae42ab4bb test: Add failing tests for Issue #1216 (hide relationships widget when empty)
Add Playwright tests that document the expected behavior for the feature
request to show the Relationships widget only when relationships exist.

Tests cover:
- Hide widget on notes with no relationships when setting enabled
- Show widget on notes WITH relationships regardless of setting
- Verify new relationshipsDisplayMode setting exists with three options

All tests are marked as test.fixme() since the feature is not yet implemented.
2026-01-01 18:09:43 +11:00
callumalpass
35dd489900 test: Add skipped tests documenting Issue #1218 multi-language NLP feature
Documents expected behavior for allowing NLP to recognize multiple
languages simultaneously. Tests are skipped as this is a feature
request - they serve as documentation for the desired behavior.

Issue #1218
2026-01-01 18:08:43 +11:00
callumalpass
a3e217e1d3 test: Add failing tests for Issue #1220 (ICS end time as due date)
Adds unit tests for the feature request to optionally use ICS event
end time as task due date. Tests cover:
- Default behavior (due remains undefined)
- New behavior when useICSEndAsDue enabled
- All-day event handling (use event date, not ICS container date)
- User override precedence
- Backwards compatibility when setting is missing

Tests currently fail as the feature is not yet implemented.
2026-01-01 18:07:30 +11:00
callumalpass
df726a2c44 test: Add failing test for Issue #1223 (Go to today timezone bug)
Adds test demonstrating timezone bug where "Go to today's note" command
opens the previous day's note for users in positive UTC offset timezones
(like Japan) during early morning hours.

Root cause: navigateToCurrentDailyNote() passes new Date() to
convertUTCToLocalCalendarDate() which extracts UTC date components,
causing the wrong day to be selected when local day != UTC day.

Fixes #1223
2026-01-01 18:02:53 +11:00
callumalpass
6468199f7f test: Add failing test for Issue #1252 (iPad date picker selection)
Adds Playwright e2e tests documenting the iPad calendar date picker bug
where selecting a date shows the animation but doesn't apply the selection.

The test uses iPad viewport dimensions (820x1180) and mobile emulation to
replicate the issue. The main test is marked as `test.fixme()` since it
documents the bug behavior.

Root cause identified: The native HTML5 date input (<input type="date">)
in DateTimePickerModal has known issues on iOS/iPadOS Safari where touch
events in modal contexts don't properly register date selection.

Affected files:
- src/modals/DateTimePickerModal.ts
- styles/date-picker.css

Fixes #1252
2026-01-01 17:58:25 +11:00
callumalpass
c23427e8e7 test: Add failing test for Issue #1297 (mobile create footer click)
The TaskSelectorWithCreate modal footer shows "Create: [Task Name]" but
is not clickable. This blocks mobile users who cannot use Shift+Enter.

The test.fixme test documents the bug: clicking the footer should create
the task but currently does nothing. A second test verifies the footer
appears with the keyboard hint, documenting current behavior.
2026-01-01 17:54:29 +11:00
callumalpass
b2fd2be9d7 test: Add failing tests for issue #1289 priority number type
Add tests documenting the desired behavior for storing priority values
as numbers in YAML frontmatter instead of strings. This supports users
who want numeric priorities for Obsidian formula compatibility.

Tests cover:
- Writing numeric priority values as numbers when priorityType is "number"
- Reading number priorities from frontmatter and converting to strings
- Round-trip consistency for numeric priorities
- Handling of non-numeric values when number type is configured

Refs #1289
2026-01-01 17:54:27 +11:00
callumalpass
ed6f913b16 docs: Add missing nav link to Default Base Templates page (#1295)
The Default Base Templates page existed but was not accessible from
the site navigation. Added the page to the Views section in mkdocs.yml.
2026-01-01 17:52:52 +11:00
callumalpass
3861d6f48b fix: Wrap blockedBy with list() in Blocking view filter (#1304)
The Blocking view filter in the Relationships base threw "Cannot find
function map on type Link" when blockedBy contained a single entry.
Bases returns single values as Link objects without a map() method.

Wrap with list() to ensure array operations work regardless of whether
blockedBy contains one or many dependencies, consistent with the
existing Blocked By view implementation.
2026-01-01 17:49:10 +11:00
callumalpass
7bb1cce4e7 fix: Apply default values when converting note to task (#1337)
When using "Convert current note to task" hotkey, the modal now correctly
respects user-configured default values for status and priority.

Previously, the task edit modal would refresh data from the file being
converted, which would overwrite the user's defaults with hardcoded
fallbacks ("open"/"normal") since the file wasn't yet a task.

Changes:
- TaskEditModal.refreshTaskData() now checks if file is a recognized task
  before overwriting task data. Non-task files preserve constructor data.
- main.ts convertCurrentNoteToTask() now uses ?? instead of || for
  status/priority to properly handle empty string defaults.

Fixes #1337
2026-01-01 17:44:24 +11:00
callumalpass
10e128167d fix: Preserve special characters in task titles when storeTitleInFilename is false
When "Store Task Title in Filename" is disabled, characters like ?, <, >, :,
etc. are now preserved in task titles. Previously these were always removed
by the title sanitization, even when the title wouldn't be used in the
filename.

Split sanitization into two methods:
- sanitizeTitleForFilename(): Full filename sanitization (removes illegal chars)
- sanitizeTitleForStorage(): Minimal sanitization (only control chars, whitespace)

Fixes #1384
2026-01-01 17:25:57 +11:00
callumalpass
62669889ac docs: Reference related issues #1214 and #979 in unreleased notes
Credit @same774 and @3zra47 alongside @Snakiest for reporting
pop-out window issues.
2026-01-01 17:00:04 +11:00
callumalpass
d78a44da89 docs: Update unreleased notes for #1409 with known limitation
Clarify that calendar event dragging in pop-out windows is limited
due to FullCalendar library using global document for mouse events.
2026-01-01 16:56:54 +11:00
callumalpass
e085c8c9a1 chore: Update FullCalendar to v6.1.20
Update from v6.1.17 to v6.1.20 for latest bug fixes and improvements.
Includes Angular 21 support, nowIndicatorSnap setting, and various fixes.

Related to #1409
2026-01-01 16:51:58 +11:00
callumalpass
6a1f57c44b fix: Use card.ownerDocument in toggleSubtasks for pop-out window support
Ensures subtask containers are created in the correct document context
when task cards are displayed in Obsidian pop-out windows.

Part of #1409
2026-01-01 16:43:26 +11:00
callumalpass
eb5c8ee265 fix: Additional pop-out window fixes for SearchBox, KanbanView, and helpers
- SearchBox.ts: Use container.ownerDocument for createElement calls
- KanbanView.ts: Fix remaining document.createElement and window.setTimeout
  calls to use containerEl.ownerDocument for pop-out window support
- helpers.ts: Use container.ownerDocument for all createElement calls
  in renderTaskNotesInBasesView, renderGroupedTasksInBasesView,
  and renderBasesDataItem functions

Part of #1409
2026-01-01 16:41:32 +11:00
callumalpass
de11200d6e fix: Pop-out window support for TaskListView and MiniCalendarView
Additional fixes for #1409:

TaskListView.ts:
- Use containerEl.ownerDocument for all createElement calls
- Use correct window for setTimeout calls

MiniCalendarView.ts:
- Use containerEl.ownerDocument for createElement and activeElement checks
2026-01-01 16:33:37 +11:00
callumalpass
1e3de6f694 fix: Additional pop-out window fixes for Calendar and base views
Extends #1409 fix with comprehensive pop-out window support:

BasesViewBase.ts:
- Use containerEl.ownerDocument for all createElement calls
- Use correct window for setTimeout (debounce timers)

CalendarView.ts:
- Use containerEl.ownerDocument for calendar element creation
- Use correct window for debounce timer
- Use arg.el.ownerDocument for ICS event icon creation

calendar-core.ts:
- Use activeDocument instead of document for dark mode detection
2026-01-01 16:31:33 +11:00
callumalpass
3fd1cd4496 test(e2e): add failing tests for issue #144 - open note in new tab
Add E2E tests documenting the expected behavior for Cmd+click on tasks:
- Cmd+click on calendar task should open note in new tab
- Cmd+click on sidebar task should open note in new tab
- Cmd+click on task card should open note in new tab
- Cmd+click should open immediately without 250ms delay
- Context menu should have "Open note in new tab" option

Tests are marked as fixme since the feature is not yet implemented.

Refs #144
2026-01-01 16:31:03 +11:00
callumalpass
96216d8f24 fix: Calendar/Agenda/Kanban/Stats views work properly in pop-out windows (#1409)
Views were broken in Obsidian's pop-out windows (new windows) because:
1. Code used global `document` which always refers to the main window
2. Standard `instanceof` checks fail across window boundaries

Changes:
- KanbanView: Use containerEl.ownerDocument for drag ghost,
  elementFromPoint, and contextmenu event listeners
- ContextMenu: Use cross-window compatible event.instanceOf() checks
- PriorityContextMenu, StatusContextMenu, TaskContextMenu: Store
  document reference from event target, use instanceOf() checks
- StatsView: Use contentEl.ownerDocument for modal backdrop
- api.ts: Use instanceOf() for container validation

Fixes #1409
2026-01-01 16:25:45 +11:00
callumalpass
a585653158 feat(TaskService): support {{currentNotePath}} for inline task command (#1334)
- Add 'manual-creation' context to use inlineTaskConvertFolder setting
- Update issue tracking for #1334, #1342, #1398, #1408
- Add failing test for issue #1302 (task not found in agenda view)
- Update .gitignore to exclude workspace.json and e2e config
2026-01-01 16:04:30 +11:00
callumalpass
3d23584fee test(unit): add tests for issue #1304 - Blocking view map on Link error
Document the "Cannot find function map on type Link" error that occurs
in the Blocking view when blockedBy contains a single dependency. The
fix requires wrapping blockedBy with list() to ensure array operations
work regardless of whether the property contains one or many values.
2026-01-01 12:32:37 +11:00