Claudio Ortolina
b557fe3eea
Fix record picker search results clearing on add
...
The update/2 callback unconditionally reset the query and results to empty
on every parent re-render. Changed to assign_new/3 so search state persists
when the parent updates the record set after adding a record.
2026-05-09 20:11:51 +01:00
Claudio Ortolina
ed6032bd15
Slow down shine animation, make it left to right only
...
Avoids dark edge at the bottom
2026-05-07 22:42:04 +01:00
Claudio Ortolina
621b35d824
Open universal search modal instantly via client-side JS
...
Replace phx-click server event with Fluxon.open_dialog for zero-latency
modal opening. The modal DOM is now always present (no :if conditional) so
it can be shown instantly; the server syncs state in the background.
Fix test selectors that now match the always-present modal form by scoping
to forms without phx-target (which the modal form always has).
2026-05-07 20:43:15 +01:00
Claudio Ortolina
10a24da49c
Improve shine animations
2026-05-07 14:19:42 +01:00
Claudio Ortolina
5f240fe573
Fix stale PubSub subscriptions on record navigation
...
Subscription management was only done in mount/3, meaning
navigating to a different record via handle_params/3 left the
old subscription active. A background update for the old record
would then overwrite the currently displayed record.
Fix: manage subscriptions in handle_params/3 (unsubscribe old,
subscribe new) via shared RecordActions.manage_subscription/2,
and guard handle_info({:update,...}) against mismatched IDs.
2026-05-07 10:14:10 +01:00
Claudio Ortolina
0a9fafd35e
Add micro_cover_url
2026-05-05 23:22:37 +01:00
Claudio Ortolina
be76d0f214
Provide mini covers (150px)
2026-05-05 16:33:43 +01:00
Claudio Ortolina
cccd28a9f9
ML-165: implementation
2026-05-05 13:43:18 +01:00
Claudio Ortolina
1ddef07bcc
fix(api): handle non-integer error ids, clamp negative pagination params
...
- show/2: use case instead of bare Integer.parse match so
/api/v1/errors/not-an-id returns 404 instead of crashing
- index/2: clamp limit to >= 1 and offset to >= 0 to prevent
SQLite from treating negative values as unlimited
- Add 3 tests: non-integer id 404, negative limit/offset clamping
2026-05-04 14:17:45 +01:00
Claudio Ortolina
51bd24d5b4
ML-162: enable /api/v1/errors endpoint
2026-05-04 13:14:40 +01:00
Claudio Ortolina
db7e50d68b
Move flash messages to the left
...
As the application makes heavy use of right-hand sheets, flash messages
are often lost.
2026-05-03 08:52:26 +01:00
Claudio Ortolina
3600bb204b
Set explicit max_frame_size on websocket
2026-05-02 07:12:20 +01:00
Claudio Ortolina
450114100b
Fix dimensions of camera button and preview
2026-05-01 22:09:44 +01:00
Claudio Ortolina
c11009f3f9
Update dependencies
...
ex_slop 0.3.1 => 0.4.0
2026-05-01 17:03:14 +01:00
Claudio Ortolina
3849b338f3
Improve performance of job counting in maintenance
...
- Use a single query for all workers
- Replace the manual Ecto query against Oban.Job with Oban.Job.query/1
2026-04-30 14:54:56 +01:00
Claudio Ortolina
c489fde1cc
ML-152: add /api/v1/ version prefix to all API routes
2026-04-30 11:57:43 +01:00
Claudio Ortolina
f8a52993c1
ML-149: Fix selected bar not showing track data in Safari
2026-04-30 07:21:25 +01:00
Claudio Ortolina
f10a932aea
Re-enable medium header + checkbox for releases with 1 medium
2026-04-27 11:47:32 +01:00
Claudio Ortolina
4418fbc377
Remove unnecessary specs
...
Function is private, and AsyncResult doesn't expose `t()`
2026-04-24 14:13:04 +01:00
Claudio Ortolina
a1c665b490
ML-21: Classify API errors as transient vs permanent
2026-04-24 14:02:15 +01:00
Claudio Ortolina
2e38412a84
ML-10: break compile cycle via Artists → Collection edge
2026-04-24 10:49:47 +01:00
Claudio Ortolina
252caf31ce
ML-11: Improve performance of Telemetry.Storage with in-memory buffer
2026-04-24 10:30:28 +01:00
Claudio Ortolina
90db113845
ML-5: document Last.fm OAuth callback trust boundary
...
Closes GitHub issue #178 .
2026-04-24 08:05:07 +01:00
Claudio Ortolina
0784fc5e0c
Fix page title for scrobble anything release page
2026-04-23 21:06:32 +01:00
Claudio Ortolina
1bd5707cb4
Fix page title for scrobble anything index and release group route
2026-04-23 21:06:12 +01:00
Claudio Ortolina
d03e288353
Make sure top_by_period components have a proper ID
2026-04-23 16:41:18 +01:00
Claudio Ortolina
62586c9ae5
Restore flex context for sheet selection bar
2026-04-23 15:12:58 +01:00
Claudio Ortolina
ca9cc7687c
Hide release-actions dropdown when empty
2026-04-23 15:06:45 +01:00
Claudio Ortolina
779708e62e
Hide print tracklist on scrobble release page
2026-04-23 15:05:05 +01:00
Claudio Ortolina
72818bfaf2
Validate release-group shape before parsing
2026-04-23 15:00:49 +01:00
Claudio Ortolina
c7c7e1fe4e
Navigate from scrobble search to release-group page
2026-04-23 14:47:50 +01:00
Claudio Ortolina
0dcd6eab83
Replace /scrobble/:release_id with nested route
2026-04-23 14:39:26 +01:00
Claudio Ortolina
d8041dc0dd
Add /scrobble/:rg_id release-group page
2026-04-23 14:35:58 +01:00
Claudio Ortolina
4c48bda7b2
Refactor Release component to take release_id
2026-04-23 14:19:11 +01:00
Claudio Ortolina
0d1f580379
Refactor TracklistPdf to take release alone
2026-04-23 07:48:53 +01:00
Claudio Ortolina
f7f38d580e
Enable unaliased modules ex_slop check
2026-04-22 20:37:09 +01:00
Claudio Ortolina
8179b4317c
ML-142: forgot to support timezones
2026-04-22 18:14:14 +01:00
Claudio Ortolina
0776700170
ML-142: Improve scrobble UI in the release component
...
- Sticky bar for easier track-based scrobbling
- Support setting custom finish time
2026-04-22 17:19:35 +01:00
Claudio Ortolina
016c4691be
Canonicalize tailwind classes
2026-04-21 14:22:41 +01:00
Claudio Ortolina
c7749924fe
Spec release component private helpers
2026-04-21 12:48:36 +01:00
Claudio Ortolina
563135fcea
Remove dead nil fallback on play_count
2026-04-21 12:48:17 +01:00
Claudio Ortolina
29bfa20978
Remove unreachable error clauses in form save helpers
2026-04-21 12:46:35 +01:00
Claudio Ortolina
dc71b2ff90
Fix badge align issue in barcode scan cart
2026-04-20 16:04:20 +01:00
Claudio Ortolina
8d004d39cc
Extract shared cart sidebar component
2026-04-20 15:57:44 +01:00
Claudio Ortolina
9851a5c6bf
Use cart with barcode scanner
2026-04-20 15:46:40 +01:00
Claudio Ortolina
d47df899b7
Improve layout of add record form
...
Remove results count (I never looked at it)
2026-04-20 15:31:14 +01:00
Claudio Ortolina
eaece07193
Count formats in results
2026-04-20 15:15:29 +01:00
Claudio Ortolina
c4ebe636ff
Fix ML-143 review: security, worker, and test improvements
...
Closes ML-143 review findings:
- cast_id/1 uses Integer.parse instead of String.to_integer
- add_to_cart validates against server-side release_groups
- JS.push payload trimmed to {id, format} only
- Oban.insert_all result checked for partial failures
- handle_async success resets @importing? to false
- ImportFromMusicbrainzReleaseGroup gets unique constraint
- Record.parse_datetime/1 made public with safe match
- Workers delegate to Record.parse_datetime/1
- Test coverage: change_format, clear_cart, wishlist single import
2026-04-20 15:15:29 +01:00
Claudio Ortolina
3f5ce060b1
Implement ML-143: Cart-style multi record import
...
Closes ML-143.
2026-04-20 15:15:29 +01:00
Claudio Ortolina
cf872cfed0
Secondary sort for artist albums in collection (purchase date desc)
2026-04-19 21:36:07 +01:00