Commit graph

3036 commits

Author SHA1 Message Date
BoulderBadgeDad
2a2ffaa192
Merge pull request #580 from Nezreka/refactor/import-routes-extraction
Extract import staging route helpers
2026-05-13 19:53:51 -07:00
Broque Thomas
d703d33178 Extract import staging route helpers
Move import staging files/groups/hints/suggestions controller logic out of web_server.py and into core.imports.routes behind an ImportRouteRuntime dependency object. Keep the existing Flask routes as thin compatibility wrappers so the UI endpoint surface stays unchanged.

Add focused tests for staging file filtering, album grouping, hint generation, cached suggestions, empty missing staging paths, and error payloads from failed path/metadata reads.

Verification: py_compile passed for web_server.py, core/imports/routes.py, and tests/imports/test_import_routes.py. A bundled-Python smoke pass covered the extracted helper behavior; pytest was not available in this Windows shell because the bundled Python lacks pytest and the repo venv is WSL/Linux-only here.
2026-05-13 19:50:58 -07:00
BoulderBadgeDad
b6b0366b64
Merge pull request #578 from Nezreka/feature/download-modal-visual-redesign
Polish Download Missing modal tracklist
2026-05-13 18:40:45 -07:00
Broque Thomas
831ddc97d8 Polish Download Missing modal tracklist
Pure CSS tune-up scoped to .download-missing-modal-content. Column
layout, table semantics, and every JS hook (#match-*, #download-*,
.track-*, .download-tracks-tbody-*) untouched.

Adds:
- Hairline row dividers + cleaner cell padding
- Hover gets accent gradient sweep + 3px inset edge bar
- Monospace track numbers (glow accent on row hover) + monospace
  tabular duration
- Status cells in both columns get uppercase micro-caps with a
  leading colored dot + soft glow halo (green/amber/blue/orange/red),
  pulses while checking + downloading
- Artist column centered
- Soft scrollbar
2026-05-13 18:38:02 -07:00
BoulderBadgeDad
8577a0563f
Merge pull request #577 from Nezreka/fix/search-source-default-not-respecting-primary
Fix search source picker defaulting to Spotify regardless of config
2026-05-13 15:44:23 -07:00
Broque Thomas
e407504e03 Fix search source picker defaulting to Spotify regardless of config
Enhanced search + global search popover always opened with the
Spotify icon active even when the user's primary metadata source
was Deezer / iTunes / Discogs / etc.

Trace: shared-helpers.js createSearchController reads
/status.metadata_source to pick the initial active icon, then
gates with SOURCE_LABELS[src]. Backend returns metadata_source
as a dict ({source, connected, response_time, ...}) — used
elsewhere for connection-state display — so SOURCE_LABELS[<dict>]
was always undefined, the guard never fired, and activeSource
silently stayed at the hardcoded 'spotify' default.

Fix reads .source off the dict (with fallback to plain-string for
forward compat). Other consumers already used ?.source — this was
the only stale call site.
2026-05-13 15:36:48 -07:00
BoulderBadgeDad
aa4e52c524
Merge pull request #576 from Nezreka/fix/downloads-page-duplicate-history-button
Drop duplicate Download History button from Downloads batch panel header
2026-05-13 15:32:18 -07:00
Broque Thomas
fcad5d4b18 Drop duplicate Download History button from Downloads batch panel header
Audit-trail PR added two buttons to the Downloads page — one always
visible next to the 'Batches' panel title, one inside the collapsible
'Recent History' header. User wants only the Recent History one.

Removes the panel-header button + the unused
.adl-batch-panel-header-actions style. Recent History button +
the original Dashboard button remain.
2026-05-13 15:11:07 -07:00
BoulderBadgeDad
c77aa61fdf
Merge pull request #530 from dlynas/feat/explicit-badges
feat: add explicit badges to discography modal and artist-detail cards
2026-05-13 15:04:14 -07:00
BoulderBadgeDad
c6cc8a9923
Merge pull request #528 from dlynas/feat/wrap-discog-modal-text
feat: wrap discog modal card titles instead of truncating
2026-05-13 15:01:47 -07:00
BoulderBadgeDad
dddf761d0b
Merge pull request #388 from kettui/feature/vite-webapp
Lay the groundwork for webui React transition
2026-05-13 14:38:55 -07:00
BoulderBadgeDad
7f20ef4760
Merge pull request #575 from Nezreka/fix/download-discography-50-album-cap
Raise discography limit from 50 to 200
2026-05-13 13:58:26 -07:00
Broque Thomas
fc366184b2 Raise discography limit from 50 to 200
Discord report: prolific artists (Bach, Beatles complete box,
deep dance/electronic catalogues) only showed ~50 entries in the
"Download Discography" modal.

`MetadataLookupOptions(limit=50, max_pages=0)` was hardcoded at
three call sites. Spotify's `max_pages=0` already paginates
through everything (per-page is clamped to 10 internally), so
Spotify-primary users were unaffected. But Deezer / iTunes /
Discogs / Hydrabase all honor the outer `limit` as a hard cap,
so non-Spotify users were silently clipped.

Bump `limit` to 200 at all three call sites — matches iTunes's
and Discogs's own internal caps and covers near-everyone's full
catalogue. Spotify behavior unchanged.

- web_server.py:9221 — discography endpoint (modal)
- web_server.py:8700 — artist-detail discography view
- core/artist_source_detail.py:129 — source-specific artist detail
2026-05-13 13:50:51 -07:00
Antti Kettunen
9258e89f56
Post-rebase cleanup 2026-05-13 22:30:13 +03:00
Antti Kettunen
8bc686afec
Normalize issues schema naming
Use camelCase for the Zod schema objects while keeping shared enum value arrays in CONSTANT_CASE.

Also adds search validation coverage for invalid statuses so the new route schema behavior stays tested.
2026-05-13 22:26:26 +03:00
Antti Kettunen
59eb8b75b0
Move shared shell chrome into bridge
Keep the page chrome sync helpers in shell-bridge.js so React and legacy routing share one implementation.

This preserves the sidebar breadcrumb and discover download bar behavior without shadowing the legacy shell helpers in init.js.
2026-05-13 22:26:26 +03:00
Antti Kettunen
82115011b2
Remove duplicate page-id bridge API
- keep getCurrentPageId off the legacy shell bridge surface
- leave page-id lookup on the router side where it is actually used
- align the bridge tests and type definitions with the slimmer API
2026-05-13 22:26:26 +03:00
Antti Kettunen
ed2b8d0e3d
Centralize issues refresh handling
- add a shared issues query invalidation helper
- invalidate from the page and domain host directly
- remove the internal window refresh event listener
- keep the legacy bridge refresh method wired to the shared helper
2026-05-13 22:26:26 +03:00
Antti Kettunen
892334007d
Refine issue detail modal rendering
- use a scoped renderer for the loading, error, and success lifecycle
- keep Show for the larger conditional blocks inside the success view
- simplify small pending-label branches back to plain ternaries
2026-05-13 22:26:26 +03:00
Antti Kettunen
6471b291fa
Unify issues validation and metadata
- add Zod-backed search validation for issues
- derive issue enums and search types from shared value arrays
- replace hardcoded filter and priority lists with shared metadata
- keep private helpers at the bottom of the issues UI files
- tighten issue detail fallback labels to shared metadata
2026-05-13 22:26:26 +03:00
Antti Kettunen
fb29e0179e
Tighten issue route typing
- Remove the remaining Oxlint warnings in the issues route UI
- Make promise handling explicit in navigation and refresh paths
- Keep the issue snapshot shape aligned with the fields the UI reads
2026-05-13 22:26:25 +03:00
Antti Kettunen
ce1fb16b76
Split webui tooling into separate configs
- Move Vite, Vitest, Oxfmt, and Oxlint into standalone config files
- Replace vite-plus scripts and test imports with direct tools
- Keep the generated route tree out of formatter and linter checks
2026-05-13 22:26:25 +03:00
Antti Kettunen
adb6426a2f
Add shared Show primitive
- move the conditional rendering helper into components/primitives
- use it in the issues board and issue domain host
- keep the issue page and host easier to scan without repeated null branches
2026-05-13 22:26:25 +03:00
Antti Kettunen
a4a4c0f12d
Flatten issues board rendering
- keep the route controller at the top of the file
- split the board into small local components
- remove the dead close-event helper and keep refresh invalidation only
2026-05-13 22:26:25 +03:00
Antti Kettunen
39f56fe63f
Promote shell context to the root route
- Wait for the legacy shell bridge/profile before React routes render
- Expose the shell bridge and profile through root TanStack context
- Update issue routes and shell helpers to consume the shared context
- Remove the redundant issues search normalization on read
- Refresh the affected tests around shell bootstrap and routing
2026-05-13 22:26:25 +03:00
Antti Kettunen
b34cea3388
Make compact form controls the default
- tighten the shared button and select primitives to the compact modal style
- remove issues-page select overrides that no longer need to exist
- drop the issue modal button sizing overrides so shared defaults handle the density
2026-05-13 22:26:25 +03:00
Antti Kettunen
32bf52cc18
Extract WebUI asset helpers
- move Vite manifest handling and SPA route rules into core/webui
- keep web_server.py focused on Flask route wiring
- add tests for asset rendering and manifest reload behavior
- keep image URL normalization coverage alongside the metadata helpers
2026-05-13 22:26:25 +03:00
Antti Kettunen
497a6f41ed
Restore legacy issue icons
- bring back the old symbol-based issue category icons in the React issues UI
- keep the issue detail modal fallback aligned with the shared metadata
- add a small regression check for the restored icon set
2026-05-13 22:26:25 +03:00
Antti Kettunen
3470654fc5
Move issue detail query into modal
- let the issue detail modal own its selected-issue query and loading states
- keep the issues page focused on route state and modal orchestration
- preserve the loader prefetch so the modal still opens from warm cache
2026-05-13 22:26:25 +03:00
Antti Kettunen
a14d397bea
Refactor shared dialog pieces
- split the modal shell into smaller shared components
- move default dialog styling into the shared dialog module
- simplify the issues modals to use the shared frame/header/body/footer pieces
- keep the issues route search navigation typed against the route
2026-05-13 22:26:24 +03:00
Antti Kettunen
bd6be61b77
Use Base UI and clsx in form primitives
- Adopt Base UI for the shared form field, input, button, and toggle wrappers
- Replace the local class-name helper with clsx to keep the primitives simpler
- Keep native textarea and select controls where they still fit the existing styling pattern
2026-05-13 22:26:24 +03:00
Antti Kettunen
f06ccd643e
Document webui folder conventions
- Describe the route-slice layout under webui/src
- Call out the dash-prefixed non-routing file convention
- Explain when to use unit, route, MSW, and Playwright tests
- Point readers to the current issues slice as the example to follow
2026-05-13 22:26:24 +03:00
Antti Kettunen
4b2c10fd12
Add MSW-backed issue API tests
- Add a shared MSW server to the Vitest setup
- Cover issue API request, success, and error scenarios
- Add msw as a dev dependency for future API-layer tests
2026-05-13 22:26:24 +03:00
Antti Kettunen
ffd989d0f3
Split issue request code into api module
- Move HTTP and query-option helpers out of -issues.helpers.ts.
- Keep -issues.helpers.ts focused on pure normalization and formatting helpers.
- Update issue route and modal callers to import request code from -issues.api.ts.
2026-05-13 22:26:24 +03:00
Antti Kettunen
9cde9442b7
Improve API JSON error handling
- Keep ky HTTPError instances intact instead of flattening them
- Use the parsed error payload when the server sends a useful message
- Fix the Issues default search type so issueId stays optional
- Add regression tests for the JSON helper behavior
2026-05-13 22:26:24 +03:00
Antti Kettunen
350c147d1e
Update webui page migration analysis
- Refresh the route inventory for the current shell
- Capture the renamed and split pages: search, watchlist, wishlist, active-downloads, and tools
- Update the migration waves and platform unlock notes to match the current app
2026-05-13 22:26:24 +03:00
Antti Kettunen
50c2d6882c
Keep Issues and artist detail history stable
- Route Issues to the React host even while the shell is still booting
- Ignore stale bootstrap work when navigation changes mid-load
- Clear artist-detail state when leaving the page so browser back can reach Library
- Add smoke coverage for the artist-detail back-navigation path
2026-05-13 22:26:24 +03:00
Antti Kettunen
8d6ab4eb74
Restore shell sync on browser history
- Re-sync the active shell page on popstate
- Keep React routes like /issues on the React host after back/forward navigation
- Preserve the existing legacy page activation path for non-React routes
2026-05-13 22:26:24 +03:00
Antti Kettunen
538bb9344b
Add workflow actions bridge to shell
- Expose SoulSyncWorkflowActions from the shell bridge
- Route album download and wishlist actions to the legacy modal helpers
- Fall back to showToast for workflow notifications
- Unblock the issue modal download button by wiring the real host contract
2026-05-13 22:26:23 +03:00
Antti Kettunen
f176ba1eb0
Clean up docs related to local development instructions 2026-05-13 22:26:23 +03:00
Antti Kettunen
3df5e4b76d
Match the legacy issue modal
- Restore the shell-era issue detail layout and hero ordering.
- Keep external links color-coded by service.
- Hide track details for album issues and keep the track list compact.
- Restore legacy track-list badge colors for format and bitrate.
- Match the neutral dismiss button styling from the old modal.
- Add regression coverage for the album issue modal state.
2026-05-13 22:26:23 +03:00
Antti Kettunen
d8f8c6b95c
Convert dev launcher to Python
- Replace the shell convenience script with a cross-platform Python launcher.
- Keep dev.sh as a Unix compatibility wrapper.
- Let the direct backend bind with host and port overrides.
- Update the root and webui README guidance for the new launcher.
- Preserve the backend startup behavior used by the old dev flow.
2026-05-13 22:26:23 +03:00
Antti Kettunen
fac4e1ba1a
Sync issues routing and shell URLs
- Move issue detail selection into route search so the modal is deep-linkable and back-button friendly.
- Normalize issue category and detail params before they reach the loader.
- Keep the legacy shell URL in sync for React-owned home pages.
- Preserve the legacy issues-tour hooks on the React issues page.
- Add Escape handling, focus trapping, and focus restore to the issue detail modal.
- Add route and helper coverage for the new search-state behavior.
2026-05-13 22:26:23 +03:00
Antti Kettunen
a2495aaba7
Format & lint React code 2026-05-13 22:26:23 +03:00
Antti Kettunen
018a554f35
Add dev launcher and update dev docs
- Introduce dev.sh as the local backend + Vite launcher
- Document the separate backend/frontend development flow
- Note that the dev Gunicorn config restarts Python on file changes
- Note that Vite hot reloads React changes in webui
2026-05-13 22:26:23 +03:00
Antti Kettunen
d1e95a0558
Add clarifying docs for hybrid webui rendering setup 2026-05-13 22:26:23 +03:00
Antti Kettunen
a9976c54ae
Centralize shell bridge glue 2026-05-13 22:26:23 +03:00
Antti Kettunen
147a09035c
Remove stale initial page rendering hooks
- Drop unused _resolve_webui_initial_* helpers from web_server.py.
- Remove template-side initial_nav_page and initial_client_page conditionals.
- Keep Vite asset injection and runtime page activation in the client.
2026-05-13 22:26:22 +03:00
Antti Kettunen
1b06b9dc33
Stub scrollTo in Vitest setup
- Silence jsdom's not-implemented warning during router-driven tests
- Keep the fix in test bootstrap only so runtime behavior stays unchanged
2026-05-13 22:26:22 +03:00
Antti Kettunen
484741db5c
Trim issue modal styling
- Remove duplicate button base styles from the issue detail modal CSS
- Keep only the layout and state-specific variants that the shared primitives still need
- Let the shared Button and TextArea own the common control styling
2026-05-13 22:26:22 +03:00