web: deep-link from RightSidebar to folder/map + anchor-mode timeline + fix root count
RightSidebar:
- Folder + Location rows gain a small ArrowUpRight icon button that
deep-links into the timeline / map view focused on the photo. OSM
external link removed; the in-app map nav covers the same job.
Folder navigation:
- New navigateToFolder(path, { focusUid, focusTakenAt }) helper in the
filters store; LeftSidebar's pickFolder collapses to a one-liner that
reuses it.
- One-shot pending-focus stash carries both UID and TakenAt across the
goto. URL-watch effect on the timeline consumes the stash so even
same-folder navigations (where the filter doesn't change) get
picked up.
Anchor-mode timeline query:
- listPhotosAround(q, takenAt, after, before) issues two parallel
PhotoPrism calls (`after:<day-1>` oldest-first + `before:<day+1>`
newest-first), merges + dedupes newest-first. Uses PhotoPrism's
existing date-only DSL clauses — no server changes.
- When a deep-link stashes a TakenAt, page 0 of the photosQuery uses
the merged window so the target photo is loaded even for photos
buried past the standard newest-first cursor. Pages 1+ are disabled
in anchor mode (PhotoPrism's day-precision cursor would infinite-loop
on dense days; users see 120 around the target, refresh to drop the
anchor).
- After page 0 lands, the existing scrollToIndex(targetIdx) expands the
windowed render set + scrolls the tile into view.
Map view:
- /map honors `?lat=&lng=&zoom=&focus=` URL params, jumping to the
photo's coordinates at zoom 17 instead of fitBounds-ing the full
library. Params are stripped after first apply so a manual zoom-out
+ reload doesn't snap back.
LeftSidebar root count badge:
- Now matches what Cmd+A selects in the timeline. Old code used
/config.count.all (library aggregate, includes archived/hidden/
review). Switched to countPhotos('', { merged: true }) which counts
the actual photo entries the timeline lists.
- countPhotos gains a `merged` option; with merged=true it returns the
response body length instead of the X-Count header — PhotoPrism's
X-Count is always the file-row count regardless of merged, so a
HEIC + JPG companion pair inflated the badge to 2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -54,6 +54,14 @@
|
||||
selection.ids.size > 0 ? selection.ids.size : selection.focused ? 1 : 0
|
||||
);
|
||||
const isBulk = $derived(selection.ids.size > 0);
|
||||
// Filename for the single-focus label. Re-derives whenever
|
||||
// selection.focused flips — cachedPhoto reads from the same query
|
||||
// cache that drives the visible tiles, so the name resolves on the
|
||||
// same tick the tile renders.
|
||||
const focusedPhoto = $derived(selection.focused ? cachedPhoto(selection.focused) : undefined);
|
||||
const focusedName = $derived(
|
||||
focusedPhoto ? photoNameAndDir(focusedPhoto).fileName : ''
|
||||
);
|
||||
// Review section uses a two-button decision flow (Keep / Archive) —
|
||||
// every other action is hidden so the choice can't be confused with
|
||||
// heap-adding / restoring. The S keybinding is rerouted to approve
|
||||
@@ -248,13 +256,19 @@
|
||||
<div
|
||||
class="flex min-h-9 shrink-0 items-center gap-2 border-t border-border bg-background px-3 py-1"
|
||||
>
|
||||
<span class="shrink-0 text-[11px] font-medium text-foreground">
|
||||
{#if isBulk}
|
||||
{#if isBulk}
|
||||
<span class="shrink-0 text-[11px] font-medium text-foreground">
|
||||
{targetCount} selected
|
||||
{:else}
|
||||
Focused photo
|
||||
{/if}
|
||||
</span>
|
||||
</span>
|
||||
{:else}
|
||||
<span class="shrink-0 text-[11px] font-medium text-muted-foreground">Focused</span>
|
||||
<span
|
||||
class="min-w-0 truncate text-[11px] font-medium text-foreground"
|
||||
title={focusedName || undefined}
|
||||
>
|
||||
{focusedName || 'photo'}
|
||||
</span>
|
||||
{/if}
|
||||
|
||||
<!--
|
||||
`overflow-x-auto` would clip the heap-picker dropdown — CSS
|
||||
|
||||
Reference in New Issue
Block a user