Skip to content

v1.12.4#771

Merged
ajslater merged 315 commits into
mainfrom
develop
May 21, 2026
Merged

v1.12.4#771
ajslater merged 315 commits into
mainfrom
develop

Conversation

@ajslater
Copy link
Copy Markdown
Owner

  • Fixes
    • Fix "Last Read" column in table view crashing.
    • Ignore dotfiles.
  • Features
    • Select by range in multi-select with shift+click.

ajslater and others added 29 commits May 11, 2026 23:17
Each MetadataText value rendered with `overflow-y: scroll`, which forces
a scrollbar even when no max-height is set. Chromium-based Edge on
Windows draws classic scrollbar arrow buttons on every forced scrollbar,
producing visible up/down chevrons next to single-line values like the
publisher, bookmark progress, and date. Other Chromium browsers don't
draw the arrows, so this only manifested on Edge.

Switch to `overflow-y: auto` so the scrollbar only appears for the two
fields that actually need it (Summary and Review, which have
`max-height: 100`). The `isOverflow` measurement still works since it
compares `clientHeight` to `scrollHeight`, which is identical under
`auto`.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Override v-window's default touch handlers in the horizontal pager so
left/right swipes route through ``routeToDirection`` instead of trying
to flip between the (disabled) v-window items. Mirrors the keyboard
arrow behavior, so RTL handling is automatic via ``normalizeDirection``.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ty (#768)

JanitorCleanupFavoritesTask was wired into janitor dispatch, nightly
queueing, and the admin task map, but missing from _SCRIBE_TASK_PRIORITY.
When the task hit the scribe queue, tuple.index() raised ValueError, the
put silently failed, and "Cleanup Orphans Favorites" stayed pending
forever.

Add it to the priority tuple and align Bookmarks/Settings ordering with
_NIGHTLY_TASK_CLASSES so the two tuples stay in sync.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
compute_group_intersections issued Count(F("bookmark_updated_at")) against
Comic, but the column is a per-user-filtered Max(bookmark__updated_at)
aggregate — not a Comic field — so Django raised FieldError as soon as a
group page was rendered in table view with the Last Read column visible.

Drop the broken scalar-paths entry and extend
_annotate_bookmark_updated_at to attach the existing aggregate to group
querysets in table view; the cell display reads it via getattr. bmua_is_max
stays bound to the primary branch so the JsonGroupArray fallback keeps
covering Comic rows that didn't get the scalar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a small central registry in codex/librarian/fs/filters.py
(_IGNORED_BASENAMES + _IGNORED_BASENAME_PREFIXES) consulted by both
the poller's DiskSnapshot walker and the watchfiles filter via
is_ignored_basename / is_ignored_path. Seeded with the "." prefix so
hidden trees (.git, .DS_Store, .Trashes, .Spotlight-V100, …) are
pruned from every traversal; extending the registry to cover @eadir,
__MACOSX, Thumbs.db, desktop.ini, etc. is a one-line edit with no
walker or filter changes.

CodexWatchFilter now takes the watched library_paths so the check
can run relative to each library root — libraries whose own path is
hidden (/Users/aj/.archive/comics) still poll their contents. The
filter is also rebuilt per watch-loop iteration so a restart()
propagates path-set updates instead of freezing them at process
startup. expand_dir_added prunes ignored directories in place via
the os.walk dirnames idiom so freshly-added trees never enqueue
events from inside a hidden subtree.

Pre-existing rows imported before this filter existed remain in
the DB until cleaned by hand or by a future janitor pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plain click still toggles a single card / row and sets it as the
anchor. Shift-click extends from the anchor to the target through
the page's displayed order, filling the range with selected = true
(not a toggle — matches Gmail / Finder / VS Code). The target
becomes the new anchor so successive shift-clicks chain naturally.

Anchor lives in the browser-select-many store (lastAnchorKey) and
invalidates implicitly: a findIndex == -1 on either endpoint
(post-paginate, post-sort, post-reload) falls back to a plain
toggle, so callers never need to clear the anchor on navigation.
clearSelection / deactivate also reset it.

A new private _visibleItems() helper is the single source of truth
for "displayed order" — rows in table mode, groups + books in
cover mode — and selectAll now uses it too. The range can span the
groups + books boundary naturally in cover mode.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ajslater ajslater merged commit 6283bbd into main May 21, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant