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.
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.
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.
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
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
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
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
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
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
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.
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
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.
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
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.
Adds Playwright tests for the incomplete task rollover feature.
These tests document the expected behavior and will pass once
the feature is implemented.
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.
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)
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.
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
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
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
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.
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
- Add complete Korean (한국어) translation with 1911 keys
- Add Korean to language selector in all locale files
- Update i18n manifest and state for new locale
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
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.
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
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.
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
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
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.
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
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.
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
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
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
- 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
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
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
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
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
- 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
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.