Split recurring tasks and reminders content into dedicated pages,
condense existing guides for clarity, and update all documentation
screenshots. Refactor e2e screenshot tests with shared openView()
helper and retry support. Refine MdbaseSpec field types (enum,
datetime, link) and replace MCPService @ts-expect-error workarounds
with bound tool pattern.
feat: prompt to save unsaved changes on task modal exit
Adds automatic unsaved changes detection and confirmation prompt when closing the Task Edit Modal through any method other than the Save or Cancel buttons. This prevents accidental data loss, especially on tablets where outside clicks are common.
- Override close() to detect changes and show confirmation
- Add i18n keys for unsaved changes dialog
- Add 11 unit tests covering all scenarios
PR #1222 by @renatomen
* feat: add option to hide identifying tags in task cards
Add a new setting "Hide identification tags in task cards" that allows
users to hide tags matching the task identification tag (including
hierarchical matches) from task card displays.
Key features:
- Setting only visible when using tag-based identification method
- Filters exact matches and hierarchical children (e.g., task/project)
- Backward compatible (default: false, shows all tags)
- Comprehensive test coverage (14 test cases)
Implementation:
- Added hideIdentifyingTagsInCards boolean to settings
- Conditional UI toggle in settings tab
- Tag filtering logic in TaskCard.ts using FilterUtils
- i18n translations for new setting
Files modified:
- src/types/settings.ts
- src/settings/defaults.ts
- src/settings/tabs/generalTab.ts
- src/i18n/resources/en.ts
- src/ui/TaskCard.ts
- tests/unit/ui/TaskCard.hideIdentifyingTags.test.ts (new)
* docs: add documentation for hide identifying tags feature
Add comprehensive documentation for the 'Hide identification tags in task cards' setting in the General Settings page.
Documentation includes:
- Detailed explanation of when the setting is available (tag-based identification only)
- How hierarchical tag matching works (exact matches and children)
- Visual demo with animated GIF
- Practical before/after example
- Clarification that tags remain in frontmatter (only visual display is affected)
Files added:
- docs/assets/demo-hide-identification-tags.gif (visual demo)
Files modified:
- docs/settings/general.md (expanded Task Identification section)
- Document hierarchical subgrouping in filtering-and-views.md with demo GIF
- Add subgrouping section to task-list.md with usage examples
- Update agenda-view.md to reference subgrouping support
- Enhance features.md overview to mention two-level organization
- Include subgroups.gif demonstration of the feature in action
Provides complete documentation for the new hierarchical subgrouping
functionality that allows two-level task organization across views.
* feat: implement status auto-suggestion with NLP integration
What:
Added status auto-suggestion triggered by configurable character (statusSuggestionTrigger setting)
Enhanced NaturalLanguageParser to handle custom status extraction before date parsing
Fixed suggestion dropdown text truncation with CSS improvements
Why:
Often users need to add tasks with a status that differ from the default status. E.g when adding a task that's already in progres.
This featue allows quick status selection during task creation via natural language input
Prevents conflict when parsing status names containing keywords like 'Now' by parsing status before chrono-node date parser
How:
User defined trigger defined in Settings -> Misc. Defaults to "*".
Status parsing disabled if the trigger setting is empty.
Implemented NLPSuggest class extending AbstractInputSuggest for status suggestions
String-based matching;
Uses case-insensitive indexOf() to handle any characters Obsidian properties accept
Processes status configs by length (longest first) to prevent partial matches
Manual boundary checking instead of unreliable regex word boundaries
* docs: add status auto-suggestion documentation
Added documentation for status auto-suggestion feature in task management:
- Updated auto-suggestions list to include status trigger
- Added Status Suggestions section with usage example
- Included visual reference to auto-suggest-status.gif
* test: add status auto-suggestion tests
Added test coverage for status auto-suggestion feature:
TaskCreationModal.status-suggestions.test.ts: Tests for modal integration, trigger configuration, and UI behavior
NaturalLanguageParser.status-extraction.test.ts: Tests for string-based status extraction
## Status Trigger Configuration
• Uses configured status trigger character from settings
• Disables status suggestions when trigger setting is empty
• Supports custom trigger characters beyond default "*"
## Status Suggestion Detection
• Detects status trigger in natural language input field
• Shows status suggestions for partial text matches
• Matches partial input like "*in" to "In Progress" status
## Status Suggestion Behavior
• Inserts status text into textarea when suggestion selected
• Works consistently with other NLP elements (@contexts, #tags, +projects)
## Natural Language Parser Integration
• Extracts status before date parsing to prevent keyword conflicts
• Handles complex status names with special characters and spaces
## String-based Status Matching
• Extracts simple status labels from text input
• Extracts complex status labels containing special characters like "Active = Now"
• Handles status names with parentheses and colons
## Boundary Checking
• Matches status at beginning, middle, and end of text
• Prevents partial word matches within larger words
• Uses proper word boundary detection
## Case Insensitive Matching
• Matches status regardless of text case (UPPER, lower, Mixed)
• Handles mixed case status names consistently
## Error Handling
• Handles missing status configurations gracefully
• Works with empty status configuration arrays
* fix: resolve status suggestion test failures
- Add proper DOM initialization helper for TaskCreationModal tests
- Fix NLP parser test expectations to align with correct date parsing behavior
- Status extraction correctly happens before date parsing to prevent conflicts
- Date expressions like 'tomorrow at 3pm' are properly parsed and removed from title
- All status suggestion tests now pass except for 2 edge cases requiring investigation
* fix: enhance chrono-node mock to properly handle time expressions
Following TDD and testing standards:
- Apply single responsibility principle to mock external dependencies properly
- Mock chrono-node to handle 'tomorrow at 3pm' as complete date expressions
- Add time parsing support for am/pm patterns in test environment
- Ensure mock returns full matched text like real chrono-node
- Fix date text removal to handle complete time expressions correctly
All 20 status extraction tests now pass, confirming:
- Status extraction happens before date parsing (prevents 'Now' conflicts)
- Complete date+time expressions are properly parsed and removed
- Time components are correctly extracted and assigned
* fix: align overlay tests with simplified implementation
Following testing standards to ensure tests expect what's implemented:
- Remove references to removed overlayHideDelay setting and dual-mode behavior
- Remove calls to non-existent clearCursorHideState function
- Update test expectations to match simplified cursor detection logic
- Align tests with actual implementation: cursor within link boundaries hides overlay
- Remove legacy vs immediate mode tests (feature was simplified)
All 21 overlay tests now pass:
- 6/6 debounce tests passing
- 6/6 context menu tests passing
- 9/9 integration tests passing
Tests now accurately reflect the simplified, working implementation.
* refactor: extract status suggestion business logic following code quality standards
Apply Single Responsibility Principle and Dependency Injection:
NEW: StatusSuggestionService
- Extract all status suggestion business logic from TaskCreationModal
- Pure business logic with no UI dependencies - easily testable
- Handles status extraction, suggestions, trigger detection, and text manipulation
- Follows single responsibility: only manages status suggestion logic
REFACTOR: TaskCreationModal
- Add dependency injection for StatusSuggestionService (optional for backward compatibility)
- Use injected service for all status-related operations
- Maintain existing public API while improving internal architecture
TESTS: Comprehensive test coverage
- 23 unit tests for StatusSuggestionService (100% business logic coverage)
- 9 integration tests verifying service integration
- All 32 tests passing - validates functionality separation
- Tests focus on business logic, not complex DOM manipulation
Benefits:
- Business logic separated from UI concerns (Single Responsibility)
- Easy to mock and test (Dependency Injection)
- Fast, reliable tests (no DOM complexity)
- Maintains backward compatibility
- Follows TDD principles with meaningful test coverage
* fix: resolve TypeScript compilation errors
- Fix StatusConfiguration -> StatusConfig type imports across all files
- Add explicit 'as const' assertions for literal union types in TaskCreationModal
- Fix DateContextMenu type guard for showPicker method
- Ensure proper type safety while maintaining functionality
All TypeScript errors resolved, build now succeeds cleanly.
* feat: complete status auto-suggestion feature implementation
FEATURE COMPLETE: Status auto-suggestion on task creation
✅ Core Implementation:
- StatusSuggestionService with comprehensive business logic
- Natural language parsing with status extraction before date parsing
- Status trigger suggestions (*status) with real-time filtering
- Proper handling of complex status names like 'Active = Now'
✅ Architecture Improvements:
- Applied Single Responsibility Principle (business logic separated from UI)
- Dependency injection for better testability
- Clean separation of concerns following code quality standards
✅ Test Coverage:
- 32 comprehensive tests (23 unit + 9 integration)
- 100% business logic test coverage
- All overlay and NLP parser tests passing (62 total tests)
- Enhanced chrono-node mock for realistic date/time parsing
✅ Technical Fixes:
- TypeScript compilation errors resolved
- Updated to TypeScript 5.9.2 for better type safety
- Fixed type imports and literal union types
- Added backward compatibility stub functions
✅ Manual Testing Confirmed:
- Status extraction from natural language input working
- Status suggestions with trigger (*) working
- Complex scenarios with dates, contexts, projects working
- Edge cases handled gracefully
The feature is production-ready with clean, maintainable architecture.
- Add inline_settings_overlay_cursor_behavior.png showing the new user configuration option
- Visual documentation of the overlay cursor behavior setting (0-500ms range)
- Demonstrates immediate mode vs legacy mode configuration for GitHub issue #117
* feat: implement multi-field user properties for dynamic filtering
- Add userFields[] data model with id, key, displayName, type
- Migrate legacy userField to userFields array on load
- Extend FilterOptions with userProperties from settings
- Update FilterBar to include user properties in dropdown
- Add evaluation logic for user:* property conditions
- Create Settings UI for managing multiple user fields
- Add comprehensive unit tests for all components
- Support Text, Number, Date, Boolean, List field types
* fix(settings/user-fields): widen inputs and align layout with Priority section
- Use grid tailored for user-fields (1fr 1fr 160px 80px)
- Make Property Name and Display Name inputs flex to full width
- Standardize type dropdown width; stack neatly on mobile
- Follow existing settings-view patterns for consistency
* feat: add bracket/quote-aware CSV splitting and missing numeric operators
- Add src/utils/stringSplit.ts with splitListPreservingLinksAndQuotes()
- Single-pass O(n) algorithm preserves commas inside [[...]] and quotes
- Handles wikilink aliases [[path|alias]] correctly
- Trims tokens and ignores empty values
- Integrate splitter in FilterService.normalizeUserListValue for string inputs
- Add missing numeric operators: is-greater-than-or-equal, is-less-than-or-equal
- Update FilterOperator type and FILTER_OPERATORS labels
- Add support for timeEstimate and user number fields
- Implement comparison logic in FilterUtils
- Fix instant user field availability in FilterBar after settings changes
- Invalidate filter options cache in main.saveSettings()
- Push fresh options to open views in settings.ts
- Add comprehensive unit tests for string splitting and filter normalization
- Fix TypeScript compilation issue with new operator validation
* docs: add comprehensive user fields documentation and examples
- Add User Fields section to Advanced Settings with setup guide
- Document all 5 field types (text, number, date, boolean, list) with examples
- Explain smart list filtering that preserves wikilinks and quotes
- Document numeric intelligence for mixed text-number formats
- Add new comparison operators (equal or greater/less than) to filtering docs
- Include practical filtering examples for custom user fields
- Add technical implementation guide for developers
- Include demonstration GIFs showing list and numeric field filtering
- Update main settings overview to reference user fields feature
* feat(filter): group by custom user fields; add dynamic group dropdown
- Support user: group keys (text/number/boolean/date/list)
- Sorting: date asc, boolean true→false, number desc, others alphabetic
- FilterBar includes user properties from FilterOptions.userProperties
- test: add coverage for boolean/list/date/unknown and FilterBar options
* feat(filtering): add sorting by user fields and wire Sort dropdown; fix grouped user-field header order to follow sort direction; emit immediate query change for sort/group; list empty values sort last
* docs(filtering): add docs for sorting/grouping by custom user fields and embed demo GIF
---------
Co-authored-by: Callum Alpass <callumalpass@gmail.com>
* feat: implement multi-field user properties for dynamic filtering
- Add userFields[] data model with id, key, displayName, type
- Migrate legacy userField to userFields array on load
- Extend FilterOptions with userProperties from settings
- Update FilterBar to include user properties in dropdown
- Add evaluation logic for user:* property conditions
- Create Settings UI for managing multiple user fields
- Add comprehensive unit tests for all components
- Support Text, Number, Date, Boolean, List field types
* fix(settings/user-fields): widen inputs and align layout with Priority section
- Use grid tailored for user-fields (1fr 1fr 160px 80px)
- Make Property Name and Display Name inputs flex to full width
- Standardize type dropdown width; stack neatly on mobile
- Follow existing settings-view patterns for consistency
* feat: add bracket/quote-aware CSV splitting and missing numeric operators
- Add src/utils/stringSplit.ts with splitListPreservingLinksAndQuotes()
- Single-pass O(n) algorithm preserves commas inside [[...]] and quotes
- Handles wikilink aliases [[path|alias]] correctly
- Trims tokens and ignores empty values
- Integrate splitter in FilterService.normalizeUserListValue for string inputs
- Add missing numeric operators: is-greater-than-or-equal, is-less-than-or-equal
- Update FilterOperator type and FILTER_OPERATORS labels
- Add support for timeEstimate and user number fields
- Implement comparison logic in FilterUtils
- Fix instant user field availability in FilterBar after settings changes
- Invalidate filter options cache in main.saveSettings()
- Push fresh options to open views in settings.ts
- Add comprehensive unit tests for string splitting and filter normalization
- Fix TypeScript compilation issue with new operator validation
* docs: add comprehensive user fields documentation and examples
- Add User Fields section to Advanced Settings with setup guide
- Document all 5 field types (text, number, date, boolean, list) with examples
- Explain smart list filtering that preserves wikilinks and quotes
- Document numeric intelligence for mixed text-number formats
- Add new comparison operators (equal or greater/less than) to filtering docs
- Include practical filtering examples for custom user fields
- Add technical implementation guide for developers
- Include demonstration GIFs showing list and numeric field filtering
- Update main settings overview to reference user fields feature
- Add bullet point about collapsible groups in widget features list
- Add new subsection with visual reference to demonstration GIF
- Document persistent state and expand/collapse all functionality
- Include demonstration GIF asset
- Fix button ordering in toolbar based on Views button alignment setting
* Left alignment: Views -> Expand -> Collapse -> Filter -> Search Box
* Right alignment: Expand -> Collapse -> Filter -> Search Box -> Views
* Ensure Expand All button is always left of Collapse All button
- Fix Group By dropdown not syncing when Clear All Filters button clicked
* Add updateDisplaySection() call to clearAllFiltersKeepModalOpen()
* Group By dropdown now properly shows None after clearing filters
- Fix Group By dropdown not syncing when right-click clearing filters
* Add updateDisplaySection() call to clearAllFilters() method
* Affects both main FilterBar and subtask widget FilterBar instances
- Fix Expand/Collapse buttons remaining visible after grouping cleared
* Add updateExpandCollapseButtons() method to manage button visibility
* Call from Group By dropdown onChange and filter clear operations
* Buttons now hide immediately when Group By changes to None
- Update filter badge demo GIF with new modal controls functionality
These fixes ensure consistent UI state synchronization across all FilterBar
instances and provide the correct button layout based on user preferences.