mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-25 22:31:48 +00:00
* feat(v3 library): A–Z fast-scroll jump rail on the Songs grid Adds a vertical letter rail (Plex/Radarr/iOS-contacts pattern) pinned to the right edge next to the scrollbar so you can jump the library to a starting letter — tap, drag-to-scrub with a live letter bubble, or arrow-key between letters. The classic (v2) tree already had letter selection; this brings the new v3 grid to parity (it was the gap behind the "alphabetical scroll selection next to the scrollbar" idea). It shows ONLY for the grid view + alphabetical (artist/title) sorts, and only offers letters present in the current sort AND filter set, so a tap always lands on a real card (absent letters are dimmed + non-interactive). The grid is forward-only, server-paged infinite scroll with no virtualization, so a jump pages through to the target card then scrolls to it; a token guards overlapping jumps (drag) so the newest wins. A keyset-seek + virtualized window is the scaling follow-up for very large libraries. Backend: /api/library/stats gains an optional `sort` param and an additive `sort_letters` map — songs-per-first-letter of the ACTIVE sort column (artist or title), filter-synced — so the rail's present-letters match the grid's real order. The legacy `letters` (distinct-artist) field is unchanged, so the dashboard + classic tree are unaffected. `sort` is dropped for providers whose query_stats predates it (existing kwarg-filter), so third-party library providers keep working (rail simply falls back / hides). Frontend: static/v3/songs.js (refreshRail / jumpToLetter / pointer-drag + keyboard, cards tagged data-letter), static/v3/v3.css (.v3-azrail + bubble). Tests: tests/test_library_filters.py (sort_letters artist/title, song-vs- distinct-artist counting), tests/test_library_providers.py (sort forwarded), tests/js/v3_az_rail.test.js (gating, data-letter, load-through, drag/keys). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QbexxfTt8q2tAn436MqGWF * fix(v3 library): harden A–Z jump rail (review P2/P3) Addresses the PR #634 review findings (manual + Codex): P2 correctness - refreshRail prefers the active-sort `sort_letters`; falls back to the artist-based `letters` only on an artist sort, and hides the rail on a title sort when a legacy provider returns none (was mislabeling letters). - reload() bumps `_jumpToken` so an in-flight letter jump can't scroll a grid that's being rebuilt from page 0. - songBucket no longer trims, matching the server SQL + grid ORDER BY raw first-char bucketing (a leading-space title now buckets under '#' on both sides). P3 polish - Paging guard is total-derived (ceil(total/PAGE_SIZE)+2) instead of a magic 4000, keeping large libraries reachable while still bounded. - Roving tabindex: only the first present letter is tabbable; arrow keys move it. Removes up to 27 page tab stops. - `sort_letters` is computed only when the caller opts in (want_sort_letters / route `sort_letters=1`); the dashboard + v2 tree skip the extra GROUP BY. Added sort + want_sort_letters to the optional provider-kwargs so non-introspectable legacy providers drop them. - _railToken supersedes stale refreshRail responses; hide the rail when no letters are present instead of rendering disabled buttons. Tests updated accordingly (v3_az_rail.test.js, test_library_filters.py). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: byrongamatos <xasiklas@gmail.com> |
||
|---|---|---|
| .. | ||
| alpha_warning_banner.test.js | ||
| app_tour_library.test.js | ||
| audio_effects_host.test.js | ||
| audio_effects_test_harness.js | ||
| audio_element_accessor.test.js | ||
| audio_session_compat.test.js | ||
| audio_session_host.test.js | ||
| audio_session_input.test.js | ||
| audio_session_mix.test.js | ||
| audio_session_monitoring.test.js | ||
| audio_session_routes.test.js | ||
| audio_session_stems_bridge.test.js | ||
| audio_session_stems.test.js | ||
| audio_session_test_harness.js | ||
| autoplay_exit.test.js | ||
| beats_loaded.test.js | ||
| capabilities_claims.test.js | ||
| capabilities_diagnostics.test.js | ||
| capabilities_lifecycle.test.js | ||
| capabilities_manifest_runtime.test.js | ||
| capabilities_multi_provider.test.js | ||
| capabilities_ownership.test.js | ||
| capabilities_test_harness.js | ||
| capabilities_versioning.test.js | ||
| capability_inspector_nav.test.js | ||
| capability_inspector_render.test.js | ||
| diagnostics_summary.test.js | ||
| edit_metadata_modal.test.js | ||
| handshapes_pipeline.test.js | ||
| highway_3d_arp_deferral.test.js | ||
| highway_3d_camera_framing.test.js | ||
| highway_3d_fret_label_render_order.test.js | ||
| highway_3d_fret_row_labels.test.js | ||
| highway_3d_fret_spacing.test.js | ||
| highway_3d_lean_sustain.test.js | ||
| highway_3d_lefty.test.js | ||
| highway_3d_overlay_full_cover.test.js | ||
| highway_3d_panel_controls.test.js | ||
| highway_3d_pool_warm.test.js | ||
| highway_3d_render_order.test.js | ||
| highway_3d_resize_reframe.test.js | ||
| highway_3d_slide_target.test.js | ||
| highway_3d_smooth_clock_pause.test.js | ||
| highway_3d_sustain_bloom.test.js | ||
| highway_3d_sustain_rail.test.js | ||
| highway_adaptive_scale.test.js | ||
| highway_audio_barrier.test.js | ||
| highway_bend_curve.test.js | ||
| highway_chord_harmony.test.js | ||
| highway_chord_render_cache.test.js | ||
| highway_colors_facade.test.js | ||
| highway_filtered_notes.test.js | ||
| highway_monotonic_clock.test.js | ||
| highway_note_state.test.js | ||
| highway_pause_throttle.test.js | ||
| highway_phrases.test.js | ||
| highway_renderer_swap_canvas_reset.test.js | ||
| highway_string_colors.test.js | ||
| highway_teaching_marks.test.js | ||
| highway_visibility.test.js | ||
| juce_engine_reroute.test.js | ||
| legacy_shim_hits.test.js | ||
| library_card_actions.test.js | ||
| live_guitar_tone_source.test.js | ||
| live_performance_hud.test.js | ||
| loop_api.test.js | ||
| loop_restart.test.js | ||
| midi_input_domain.test.js | ||
| note_detection_domain.test.js | ||
| pedal_cables.test.js | ||
| play_button_reroute_guard.test.js | ||
| playback_app_adapter.test.js | ||
| playback_compat.test.js | ||
| playback_diagnostics.test.js | ||
| playback_domain.test.js | ||
| playback_test_harness.js | ||
| plugin_style_injection.test.js | ||
| plugins_page.test.js | ||
| progress_calibration.test.js | ||
| progression_notifications.test.js | ||
| progression_progress_events.test.js | ||
| settings_autosave.test.js | ||
| song_close.test.js | ||
| song_credits_overlay.test.js | ||
| song_event_payload.test.js | ||
| song_restart.test.js | ||
| song_seek.test.js | ||
| speed_reset.test.js | ||
| test_utils.js | ||
| tour_engine.test.js | ||
| tuner_auto_open.test.js | ||
| tuner_core.test.js | ||
| tuning_display.test.js | ||
| tuning_targets.test.js | ||
| v3_add_to_playlist_menu.test.js | ||
| v3_az_rail.test.js | ||
| v3_library_refresh.test.js | ||
| v3_playlist_cover.test.js | ||
| v3_songs_score_badge_refresh.test.js | ||
| v3_songs_scroll.test.js | ||
| v3_songs_tuning.test.js | ||
| venue_instrument_pov.test.js | ||
| venue_mood_fx.test.js | ||
| venue_scene_3d.test.js | ||
| venue_viz.test.js | ||
| visualization_domain.test.js | ||