Clicking a week/month/quarter/year in a vault whose configured folder does
not exist yet failed with a generic 'Failed to create X note: <raw error>',
because vault.create refuses to create parent folders. Create the folder
(and any missing ancestors) first, then report what actually went wrong.
- Every failure path now names the offending path and the reason, and points
at the relevant settings section; diagnostic notices stay up for 10s.
- A configured-but-missing template used to fall back to basic frontmatter
silently; the creation notice now says the template was not found.
- The unreachable !date.isValid() branch after detectPeriodType is gone; the
'not a periodic note' notice now lists the configured formats it expected.
Drops the default button background/shadow from the header 'more', calendar
nav and Today buttons, and tightens breadcrumb spacing so Q/month/year read
as inline links rather than buttons.
DOCUMENTATION.md said recent files were in-memory only and lost on vault
close, while the code persists them under waypointData.recentFiles; the
WaypointData/RecentFilesSettings/WaypointSettings snippets were also missing
real fields. Fix those, describe the new behaviour (single-writer saves,
settings-driven period detection, O(1) basename lookups, folder-aware rename
remapping, unified openPeriodNote, typechecked build), and trim Known
Limitations to the two still true (full-DOM redraw, CDN icon dependency).
QA.md: restate the 'No icon' case and add coverage for week-number
middle-click and for moving a folder that contains bookmarked files.
The build only ran esbuild, which strips types without checking them — that
is how the week-number ReferenceError shipped. Add a typecheck script and run
it before bundling. It is invoked as 'node node_modules/typescript/bin/tsc'
rather than a bare 'tsc' because this repo's node_modules/.bin entries are
Linux-style symlinks with no Windows .cmd shims, matching how the existing
scripts already call 'node esbuild.config.mjs' directly.
- tsconfig lib gains ES2017 so Object.entries resolves (was TS2550 plus
cascading TS7031 implicit-any errors); strictness untouched.
- manifest minAppVersion 0.16.3 -> 1.4.4: the plugin calls setTooltip(), added
in API 1.4.4, so every declared-supported version below that threw
TypeError on render.
- settings-tab: type plugin as WaypointPlugin via a type-only import (no
runtime cycle) to drop the (this.plugin as any).saveSettings() cast, and
make the slider helper generic instead of obj: any. No UI change.
- Add the MIT LICENSE file that package.json and the About tab already claim.
- Middle-clicking a calendar week number threw ReferenceError: monday is not
defined (shipped in v1.5.1) — the variable was declared inside the click
closure and read from the sibling mousedown handler. Hoist it to weekStart.
- promptIcon guarded on if (iconName), so the picker's 'No icon' link
submitting '' was silently dropped and the old icon stayed. '' is a valid
value; always apply it.
- renderCalendar scanned vault.getFiles() per day cell (up to 42 full vault
scans per render); use the O(1) plugin.hasNoteForDate().
- Collapse ~180 lines of triplicated drag listeners into one
attachBookmarkDragHandlers(); replace (el as any).__dropAbove/__dropInto
stashing with a typed WeakMap; drop the getLeaf(x as any) casts.
- dragManager.dragFile was called twice per dragstart; call it once behind a
single narrowly-typed accessor.
- Cache the Lucide catalog per session instead of refetching the CDN on every
picker open; normalize IconSuggestModal to the file's const/arrow style.
- onRename remapped paths by exact equality only, so files inside a moved
folder kept stale paths and the view then permanently deleted their
bookmarks on next click. Add pure remapRenamedPath() (path-utils.ts,
obsidian-free so it is unit-testable) and remap recentFiles + the whole
bookmark tree, folder moves included.
- saveSettings/saveWaypointData each did loadData -> mutate one key ->
saveData, so two concurrent saves carried a stale snapshot of the other
key and one silently reverted the other. Both now delegate to persistAll(),
which writes both keys from memory through a promise-chain mutex.
- data.json is read once in onload instead of twice; period sub-objects are
deep-merged so old configs pick up new fields.
- detectPeriodType now derives from the configured nameFormat with strict
moment parsing instead of hardcoded regexes, so custom formats work.
- Merge openPeriodNoteInLeaf into openPeriodNote(period, date, leaf?); stop
double-appending .md to templateFile; type the caught error as unknown.
- hasNoteForDate is synchronous and O(1) over a maintained basename Set;
delete dead getNotesForDate.
- Implement the previously dead omittedTags filter and the no-op
updateOn: 'file-edit' mode (vault modify event).
Shallow Object.assign on settings meant filterTags (new in 1.5.0) was
undefined for anyone with prior saved settings. Accessing .length on
undefined threw, killing the entire redraw before calendar could render.
- Defensive fallback: filterTags || []
- Deep merge on loadSettings for recentFiles, calendar, display
New 'Filter tags' setting in Recent Files tab. Enter tag names one per line
to pin specific tags as filter pills. Leave empty to auto-detect from
frontmatter 'type' property (existing behavior).
The limit was only applied on file-open and plugin load, not when the user
changed the maxItems setting in the settings tab. Now enforceRecentFilesLimit()
is called on every settings change via the onSettingsChange callback.
- Recent files are now persisted to disk and survive restarts
- Max items limit is applied on load (in case setting was reduced)
- Omitted paths regex filtering is now wired up in addToRecentFiles
- Fixed saveAndRefresh() overwriting entire plugin data on settings change
- Debounced disk writes (300ms) to avoid excessive saves on rapid opens
When dragging B onto A, the result is now:
- New Group (empty, no file)
- File A
- File B
Previously the group inherited A's file, creating a self-referencing parent.
Drag-and-drop:
- Dropping a bookmark onto a file bookmark (middle zone) creates a new
parent note group containing both items
- Dropping onto a group still moves into the group as before
- All file/group bookmarks now accept drops (3-zone behavior)
Calendar:
- Fixed broken table layout caused by display:flex on td elements
- Uses vertical-align:middle instead for cell content centering
- Calendar cells still have configurable height via CSS variable
View:
- Chevron moved from left side to right side of bookmark rows
- Display settings applied as CSS variables on the view element
Settings:
- Tabbed UI with 4 tabs: Calendar, Periodic Notes, Recent Files, Display
- Display tab: row size, row spacing, indent size, font size, icon size, calendar cell size
- All settings use sliders with live preview and dynamic tooltips
- Reset to defaults button
CSS:
- Bookmark items use CSS variables (--wp-row-size, --wp-row-spacing, etc.)
- Calendar cells use --wp-cal-cell-size for configurable height
- Settings tab styling with active indicator
Recent files:
- Type filter bar with pill tags above the list
- Scans frontmatter 'type' property of each recent file
- Click a pill to filter, click again or 'all' to clear
- Active pill shows accent color
Calendar:
- Middle-click on day/week/quarter/month/year opens in new tab
- openPeriodNoteInLeaf() method for leaf-targeted opening
- More spacing: taller day cells, more padding, wider margins
Bookmarks:
- Right-click on recent file → 'Add to bookmarks' option
- Recent files right-click now has 'Add to bookmarks' option
- Calendar: middle-click on day/week/quarter/month/year opens in new tab
- Added openPeriodNoteInLeaf() method for opening period notes in a specific leaf
Drag-and-drop:
- 3-zone drop indicator for groups and parent notes (files with children):
top 25% = drop above, middle 50% = drop into, bottom 25% = drop below
- 2-zone for regular files/separators/spacers (unchanged)
- 'Drop into' shows background highlight instead of border line
- Circular reference guard: can't drop a group into itself or descendants
⋯ button:
- No visible button chrome when not hovered (no border, no background)
- Subtle opacity (0.6) at rest, full opacity on hover
- Hover shows text color change only, no background highlight
The icon picker now searches against the Lucide tags.json keyword list,
not just the icon name. Searching 'meeting' now finds 'calendar',
'red-heart' finds 'heart', etc. Tags are loaded alongside icon names
from the CDN with fallback.
- File bookmarks can now have children, rendered with a chevron
- Group bookmarks can have an associated filePath; clicking opens the file,
clicking chevron toggles collapse
- 'Add as parent note' option in header context menu creates a group
with the current file linked
- 'Add child note' option in group context menu creates a sub-group
with the current file linked (parent note pattern)
- Default icon changed from 'file'/'folder' to '' (no icon)
- Chevron click always toggles collapse regardless of type
- File bookmarks: middle-click opens in new tab, mod+click opens in new leaf
- Group bookmarks: middle-click opens group's linked file in new tab,
mod+click opens group's linked file (click still toggles collapse)
- Add 5 'Go to' commands with default hotkeys:
Ctrl+Shift+Alt+D/W/M/Q/Y for daily/weekly/monthly/quarterly/yearly
- Add 10 navigation commands (next/prev) for each period type
- Add detectPeriodType() and navigatePeriodNote() helpers
- Bump version to 1.1.0