Commit graph

2003 commits

Author SHA1 Message Date
callumalpass
776c15658d add new image 2025-12-07 15:50:26 +11:00
callumalpass
743c093046 docs: update README with recent features
Add documentation for OAuth calendar sync, batch operations, custom
user fields, webhooks, formula properties, and other v4.1.x features.
2025-12-07 15:47:30 +11:00
callumalpass
4278a2e02d refactor: move GitHub star message to top of release notes
Move the star suggestion from the footer to immediately after the header
for better visibility. Also make "GitHub" text a clickable link to the
repository.
2025-12-07 15:33:14 +11:00
callumalpass
a03c312884 docs: document default values for custom user fields
Add documentation for the new default value feature in custom user
fields, including the different input formats for each field type and
where defaults are applied during task creation.
2025-12-07 15:26:34 +11:00
callumalpass
1681aa78d1 i18n: add translations for custom user field default values
Add translations for 3 new keys in all 7 locales (de, es, fr, ja, pt,
ru, zh) for the custom user field default value feature:
- settings.taskProperties.customUserFields.fields.defaultValue
- settings.taskProperties.customUserFields.placeholders.defaultValue
- settings.taskProperties.customUserFields.placeholders.defaultValueList
2025-12-07 15:21:19 +11:00
callumalpass
1c40d8e3f4 refactor: centralize task creation defaults in TaskService
Move task creation defaults application logic from individual callers
into TaskService.createTask() to eliminate code duplication.

Changes:
- Add applyDefaults option to TaskService.createTask() (default: true)
- Create private applyTaskCreationDefaults() method in TaskService
  that handles all defaults: due, scheduled, contexts, projects, tags,
  time estimate, recurrence, reminders, and user field defaults
- Update TaskCreationModal to pass applyDefaults: false since defaults
  are already applied to form fields during initialization
- Update ICSNoteService to pass applyDefaults: false since calendar
  events have their own data and shouldn't receive defaults
- Remove duplicate applyTaskCreationDefaults() from TasksController
  and SystemController
- Simplify InstantTaskConvertService and TaskSelectorWithCreateModal
  to only handle NLP-parsed user fields, letting TaskService apply
  defaults for unparsed fields
- Update test mocks for TaskService to include calculateDefaultDate

This refactor reduces code duplication and ensures consistent default
application across all task creation paths.
2025-12-07 15:13:57 +11:00
callumalpass
a7a2eeb767 feat(settings): add default values for custom user fields (#1080)
Add ability to set default values for custom user fields that are
automatically applied when creating new tasks.

- Add defaultValue property to UserMappedField interface
- Add type-appropriate default value inputs in settings UI:
  - Boolean: toggle
  - Number: number input
  - Date: dropdown with presets (None/Today/Tomorrow/Next Week)
  - Text: text input
  - List: comma-separated text input
- Apply defaults in all task creation paths:
  - TaskCreationModal (modal UI)
  - InstantTaskConvertService (inline task conversion)
  - TasksController (REST API)
  - SystemController (NLP API)
  - TaskSelectorWithCreateModal (create or open command)
- Fix settings cards collapsing on value change by updating DOM
  directly instead of re-rendering
2025-12-07 15:04:38 +11:00
callumalpass
9b41d210b8 feat: add command to convert current note to task (#803)
Add new "Convert current note to task" command that opens the task edit
modal pre-populated with the note's existing frontmatter and body content.
The command adds required task properties to convert a regular note into
a TaskNote in-place.

Thanks to @GardarikanetS and @diegomarzaa for suggesting.
2025-12-07 14:52:30 +11:00
callumalpass
8fdb9cae65 feat(i18n): add translations for convert note to task command
- Add translations for new "Convert current note to task" command
- Rename "Convert task to TaskNote" to "Convert checkbox task to TaskNote" for clarity
2025-12-07 14:51:58 +11:00
callumalpass
a2eee2d217 style(settings): change documentation link from button to simple link
Remove button-like styling (padding, border-radius, background hover)
and use standard link styling with underline on hover instead.
2025-12-07 14:25:59 +11:00
callumalpass
f0cd9fce5a fix(calendar): fix invisible text in light mode and stale data after updates
- Fix calendar event text being invisible in light mode when using
  default priority colors (CSS variables like var(--color-accent))
  - hexToRgba() now handles CSS variables gracefully
  - Events use theme-appropriate text colors when border is a CSS variable

- Fix calendar not updating immediately after completing/skipping
  recurring task instances via context menu
  - Context menu actions now read fresh data from Obsidian's metadata
    cache instead of Bases' potentially stale cache
  - Added refreshCalendarWithFreshData() method for immediate updates

- Simplified onDataUpdated() and handleTaskUpdate() to use full render()
  with 5-second debounce for background updates
2025-12-07 14:15:12 +11:00
callumalpass
c607c7d408 fix: archive button too narrow on mobile in task edit modal
Use Obsidian's .is-mobile class to properly detect mobile devices
instead of relying solely on viewport width. The save button's
margin-left: auto now only applies on desktop.
2025-12-07 13:27:45 +11:00
callumalpass
5708d3dd9d docs: consolidate and streamline documentation
- Add v3 to v4 migration guide with Bases setup instructions
- Expand core-concepts.md with YAML structure, property types, and methodology examples
- Streamline index.md to be a concise landing page with quickstart
- Remove developer-focused timezone docs (TIMEZONE_HANDLING_*.md)
- Update releases.md to show v4.x as current
- Fix broken relative links in features.md
- Reduce repetition across docs by centralizing Bases info in core-concepts.md
- Consolidate task-management.md recurring tasks and reminders sections
- Simplify features/integrations.md and features/calendar-integration.md
- Reduce task-defaults.md Default Reminders section from 227 to 24 lines
- Add v4/Bases troubleshooting and OAuth calendar troubleshooting sections
- Update troubleshooting.md with current settings paths and GitHub link
- Update calendar-setup.md with Azure manifest redirect URI instructions
2025-12-07 13:03:21 +11:00
callumalpass
d239cd3be8 feat(settings): add documentation link to settings panel
Add a prominent link to tasknotes.dev documentation below the tab
navigation in the settings panel.
2025-12-07 12:42:23 +11:00
callumalpass
779e7cd5f3 refactor(settings): move converted tasks folder setting to General tab
- Move "Folder for converted tasks" from Features to General > Task Storage
- Setting now appears conditionally when instant convert is enabled
- Update description to clarify that empty = use default tasks folder
- Update placeholder to show actual default {{currentNotePath}}
- Update documentation for the reorganized setting
2025-12-07 12:28:09 +11:00
callumalpass
01ac9ee003 fix(#1301): remove blank space from inline task wikilinks when metadata is empty
Only apply margin and min-width to metadata container when it has content,
preventing blank space when all inline task properties are disabled.
2025-12-07 12:09:53 +11:00
callumalpass
bcc79c131c perf(calendar): add 5-second debounce to prevent flickering during typing
- Override onDataUpdated in CalendarView for lighter updates (just refetch
  events instead of full re-render)
- Override handleTaskUpdate to use same debounce timer
- 5-second debounce outlasts Obsidian's ~2-second save interval, ensuring
  calendar only updates after user stops typing
2025-12-07 11:54:09 +11:00
callumalpass
d12cbb3939 perf: major performance improvements for Bases views
- Lazy-load computed file properties (backlinks, links, etc.) during render
  instead of extracting upfront for all items. Reduces extractDataItems
  from ~4s to ~5-10ms for 6000+ tasks.

- Only visible items trigger expensive getValue() calls, leveraging
  virtualization (20-50 items vs 6000+).

- Add 500ms debounce to onDataUpdated to prevent UI freezes during typing.

- Add visibility checks to skip rendering hidden/disconnected views.

- Debounce metadata change handlers in editor decorations.

- Use metadataCache for timeblock generation instead of file reads.

- Add date range filtering for calendar events.

- Preserve file.* prefix in PropertyMappingService to distinguish
  file.backlinks from note.backlinks.

- Fix CalendarView overwriting basesData (breaking lazy property access).
2025-12-07 11:37:15 +11:00
callumalpass
cc9e51254d i18n: remove marketing language from feature descriptions
Replace promotional phrasing with clear, functional descriptions:
- inlineTasks: focus on what settings control
- nlp: describe the parsing functionality
- pomodoro: describe configuration purpose
- migration: clarify RRULE usage, use "complex" instead of "powerful"
2025-12-07 09:09:33 +11:00
callumalpass
60f77b8172 i18n: add recurrenceAnchor translations and update excludedFolders description
- Add recurrenceAnchor.name and recurrenceAnchor.description to all locales
- Update excludedFolders.description to accurately reflect its usage
  (task indexing and project suggestions, not just "Notes tab")
2025-12-07 09:00:42 +11:00
callumalpass
7b9affb824 fix(#1319, #1310): add missing field mappings and fix inline task truncation
- Add recurrence_anchor property to Field Mapping settings UI (#1319)
- Add skipped_instances property to Field Mapping settings UI (#1319)
- Fix inline task conversion deleting text when title exceeds filename limits (#1310)
  - Overflow text is preserved in task note body
  - Truncation respects word boundaries
2025-12-07 08:18:52 +11:00
callumalpass
24f6ad42a2 fix(#1317): project autosuggest filters broken when only propertyKey set
The filter enabling logic in FileSuggestHelper required both propertyKey
AND propertyValue to be truthy. Since empty string is falsy in JS, setting
only propertyKey (to check property existence) disabled the filter entirely.

Refactored to use shared getProjectPropertyFilter() which correctly enables
the filter when propertyKey.length > 0, matching the Modal path behavior.
2025-12-05 21:47:24 +11:00
callumalpass
d9aece72dd i18n: add translations for Task Properties settings and New button
Translate 77 new settings.taskProperties.* keys to all 7 locales:
- Section headers (core/date/organization/details/metadata/feature)
- Property card common fields (propertyKey, default, nlpTrigger, etc.)
- Individual property names and descriptions (22 properties)
- Card-specific labels (status, priority, projects, title, tags, reminders)

Also add common.new key for the custom "New Task" button in Bases views.
2025-12-05 21:17:57 +11:00
callumalpass
57d4d10d7e feat: add custom "New Task" button to Bases views
Replace the default Bases "New" button with a TaskNotes button that
opens the task creation modal when clicked. The button is injected
into the Bases toolbar and visibility is toggled via CSS based on
whether a TaskNotes view is active.

- Add setupNewTaskButton() to BasesViewBase for toolbar injection
- Use tasknotes-view-active class to toggle button visibility
- Refactor CalendarView to call super.setupContainer() for consistency
- Hide native "New" button when TaskNotes view is active
2025-12-05 19:54:52 +11:00
callumalpass
5764dbef70 feat: add descriptions to property cards in Task Properties settings
Add helpful descriptions to each property card explaining its purpose
and how it's used. Also adds the missing skippedInstances property card.
2025-12-05 19:25:48 +11:00
callumalpass
d168644661 refactor: split taskPropertiesTab into modular components
- Extract property card renderers into separate modules:
  - helpers.ts: shared types, NLP trigger helpers, simple/metadata cards
  - statusPropertyCard.ts: status values with drag-drop reordering
  - priorityPropertyCard.ts: priority values with drag-drop reordering
  - projectsPropertyCard.ts: projects with autosuggest filters
  - tagsPropertyCard.ts: native Obsidian tags
  - remindersPropertyCard.ts: default reminder configuration
  - titlePropertyCard.ts: title and filename settings
  - userFieldsCard.ts: custom user fields

- Add Feature Properties section for pomodoros, ICS event ID, and
  ICS event tag (properties not stored in task frontmatter)

- Update documentation to reflect settings reorganization:
  - Task Properties tab now contains property keys, defaults, and NLP triggers
  - Defaults tab redirects to new locations
  - Appearance tab references moved settings
  - Features tab documents body template settings
2025-12-02 10:04:21 +11:00
callumalpass
d9c4b2f196 refactor: consolidate property settings into unified Task Properties tab
- Move property key, default value, and NLP trigger settings into unified
  property cards in the Task Properties tab
- Remove Defaults tab entirely (body template moved to Features tab)
- Move title/filename settings from Appearance tab into Title property card
- Move project autosuggest settings from Appearance tab into Projects card
- Add collapsible sections for status/priority values, autosuggest filters,
  and display customization
- Add onCollapseChange callback to CardComponent for preserving collapse state
- Add "Feature Properties" section for pomodoro and calendar sync properties
- Improve styling for default project chips and remove button shadows
- Add right-aligned inputs in card components
2025-12-02 09:29:19 +11:00
callumalpass
3d6192da59 release 4.1.1 2025-12-01 21:44:07 +11:00
callumalpass
be43ee6029 feat: add icon autosuggestion for custom status settings (#1277)
- Type to search through all available Lucide icons
- Shows icon preview alongside each suggestion
- Live preview of selected icon next to the input field
2025-12-01 21:22:48 +11:00
callumalpass
d0d0974ec2 docs: add formula expressions to Base templates documentation
Include the actual Bases formula expressions in the formula reference
tables so users can see and copy the exact syntax used.
2025-12-01 21:22:00 +11:00
callumalpass
c517957349 feat: add 30+ formula properties to default Base templates
- Add date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified
- Add boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate
- Add time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted
- Add grouping formulas: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus
- Add combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek
- Add sorting: priorityWeight (user-configurable), urgencyScore (combines priority with date proximity)
- Add display: dueDateDisplay (relative dates)
- Sort action views (Not Blocked, Today, Overdue, This Week) by urgencyScore
- Rename settings section to "Views & base files" with improved documentation
- Fix null handling in order array generation
2025-12-01 20:53:49 +11:00
callumalpass
7f91cd59b6 docs: update default base templates documentation
Add formulas section with priorityWeight, blockedBy to order arrays,
and fix quote escaping in filters to match current implementation.
2025-12-01 18:16:49 +11:00
callumalpass
887487448a fix: respect Kanban column width setting on mobile (#1279, #1282)
- Remove mobile media query constraints that overrode user's column width setting
- Add spacing between task title and metadata in inline task widgets
2025-12-01 07:22:45 +11:00
callumalpass
dee04a7c56 fix: use UTC-anchored dates in Base views for recurring task completion (#1026, #1177)
Base views were using raw `new Date()` for targetDate, which caused
formatDateForStorage() to extract the wrong calendar day for users in
negative UTC offset timezones (e.g., PST/PDT) after UTC midnight.

Now uses createUTCDateFromLocalCalendarDate() to preserve the user's
local calendar day when recording complete_instances.
2025-12-01 06:24:26 +11:00
callumalpass
be9358f9a5 docs: add video guide for Google Calendar OAuth setup
Embedded tutorial video in calendar setup documentation to help users
configure Google Calendar OAuth credentials.

Thanks to @antoneheyward for the tutorial.
2025-11-30 20:17:08 +11:00
callumalpass
ef344eddbc feat: use custom status icons in all context menus
Previously, custom status icons only displayed in task cards. Now they
also appear in the status submenu of task context menus, batch context
menus, and task creation/edit modals.
2025-11-30 20:04:04 +11:00
callumalpass
31e9633563 release 4.1.0 2025-11-30 18:58:10 +11:00
callumalpass
8644a6e3d0 fix: add missing getNextStatus mock in TaskCard context menu tests 2025-11-30 18:57:07 +11:00
callumalpass
00cc503384 feat: add calendar event stacking configuration options (#1257, #1064)
Add user-configurable options for controlling how events display and
stack in the calendar view:
- slotEventOverlap: toggle visual overlap of timed events
- eventMaxStack: limit stacked events in week/day view
- dayMaxEvents: limit events per day in month view
- dayMaxEventRows: limit event rows per day in month view

Also includes dark mode styling fixes for the timeGrid more-link element
and translations for all supported locales.
2025-11-30 18:45:53 +11:00
callumalpass
fa357a69f5 fix: auto-sync user fields to modals and fix link rendering (#1271, #1256)
User fields:
- New custom fields are now automatically added to modal configuration
- Deleting a field removes it from modal configuration
- Updating display name syncs to modal configuration

Link rendering in custom properties:
- Extract raw values from Bases Value objects for proper link detection
- Restore wikilink format for internal links from Bases API
- Handle links in list-type properties
2025-11-30 18:14:43 +11:00
callumalpass
2af2bcdad1 feat: add custom icon support for task statuses (#1245, #793)
Add optional Lucide icon configuration for task statuses, allowing
shape-based status differentiation alongside color coding.

- Add icon field to StatusConfig type
- Render Lucide icons via setIcon() when icon is configured
- Add CSS for icon-based status indicators with theme color support
- Add icon input field to status settings UI
- Add translations for all 8 locales (en, de, es, fr, ja, pt, ru, zh)

Users can configure icons per status in Settings → Task Properties by
entering a Lucide icon name (e.g., check, circle, clock). Icons inherit
the status color and improve accessibility for colorblind users.
2025-11-30 17:43:16 +11:00
callumalpass
4ef3fc482c fix: multiple bug fixes and UI enhancements
- (#904) Add visual highlighting for overdue/past dates on task cards
- (#1128) Allow slashes in NLP context names for hierarchical contexts
- (#1151) Increase mini calendar heatmap color intensity for better visibility
- (#1164) Add priorityWeight formula to default Bases templates
- (#1170) Fix dateCreated/dateModified using custom property names in ICS notes
- (#1171) Fix calendar event toggles not responding to changes after initial load
- (#1198) Fix project links resolving relative to wrong file in Bases views
2025-11-30 17:16:16 +11:00
callumalpass
1b921bed6e fix documentation formatting 2025-11-30 15:53:46 +11:00
callumalpass
855c301848 docs: add property types reference documentation (#1259)
Add comprehensive documentation for frontmatter property types to help
users understand expected data formats when creating tasks via templates
or manual editing.
2025-11-30 15:49:21 +11:00
callumalpass
96bb0b164a feat: add formula property support for Bases view grouping (#1248, #1070)
- Add formula properties to Task List sub-grouping dropdown
- Add formula properties to Kanban swimlane dropdown
- Update buildPathToPropsMap() to include formula results from Bases
- Update getPropertyValue() to handle formula.* property IDs
- Update valueToString() to handle Bases Value objects (NullValue, ListValue, etc.)
- Add drag-and-drop check for formula-based columns/swimlanes with toast notification
  (formulas are computed values and cannot be directly modified)
2025-11-30 15:35:48 +11:00
callumalpass
712bfab85b fix: (1272) recurrence anchor not being saved when set to completion 2025-11-30 14:58:30 +11:00
callumalpass
128901c713 fix: add defensive fallback for this.app in Bases views (#1273)
Add fallback to plugin.app when this.app is not yet set by Bases,
preventing "Cannot read properties of undefined (reading 'app')"
errors during initialization.
2025-11-30 13:52:58 +11:00
callumalpass
3daa9d2222 fix: improve unsaved changes modal UX and architecture (#1222)
- Refactor close() to be synchronous, matching Obsidian's modal lifecycle
- Add forceClose() method to bypass confirmation when appropriate
- Add third "Keep Editing" button to return to modal without closing
- Handle save failures gracefully (modal stays open if save fails)
- Add re-entrancy protection to prevent issues from rapid clicks
- Add i18n key for "Keep Editing" button
- Translate all missing keys for 7 locales (84 translations total)
- Update tests to match new synchronous close() behavior
- Add release notes entry crediting @renatomen and @0-BSCode
2025-11-30 13:17:18 +11:00
callumalpass
ccbcc3608a fix: NLP parser Unicode support and priority settings UX (#485, #1221, #1249, #1262)
- Use Unicode-aware regex patterns (\p{L}\p{N}\p{M}) for tags, contexts,
  projects, and user fields to support non-ASCII characters (accented
  letters, Cyrillic, CJK scripts)
- Fix project preview in task creation modal wrapping wikilinks in extra
  brackets (showing [[[[Project]]]] instead of +[[Project]])
- Make priority cards draggable in settings to allow reordering
- Sort priorities by weight instead of alphabetically
- New priorities now get max weight + 1 instead of fixed weight 1
2025-11-30 11:32:48 +11:00
callumalpass
547004934a fix: preserve scroll position in Kanban view after task changes (#1266)
Override onDataUpdated() and debouncedRefresh() in KanbanView to save
and restore column scroll positions during re-renders. Implements
getEphemeralState/setEphemeralState to capture scroll positions for
both virtual scrolling columns and regular columns, including swimlane
cells.
2025-11-30 11:32:48 +11:00