Initial frontend implementation #15

Merged
blacklight merged 61 commits from frontend into main 2026-08-26 02:21:47 +02:00
Owner
No description provided.
* main:
  ci: run test and LINT only on push events on the backend files
  fix(test): Re-added required _minimal_config fixture for test_app.py
  test: Removed flaky test_tornado_stops_promptly_on_signal
* main:
  chore(drone): run Codacy coverage pipeline only when backend files change
- Add login/register/password reset/verify email routes and views with tests
- Implement profile page w/ tabs, avatar upload, and API token management
- Add files upload API + tests and i18n datetime formatter + strings
- Update AppLayout to show user menu/logout; tweak theme tokens and inputs
- Mark login/refresh/logout/register/reset/verify requests as skipAuth
- Add vitest coverage to ensure no auth header or refresh loop on 401
- Skip auth/refresh when skipAuth is set
- Add tests for skipAuth and retry-401 logout
fix(frontend): improve error messages and API token UX
Some checks failed
continuous-integration/drone/push Build is failing
73bb5cdd47
- Add getApiErrorMessage helper and use across auth/profile views
- Extend AppInput to support textarea rendering
- Validate API token expiry and harden clipboard copy/revoke confirmation
- Update i18n strings and add/adjust unit tests
fix(api): persist API token revocation and filter active tokens
All checks were successful
continuous-integration/drone/push Build is passing
8eb87e529e
The create and revoke API-token routes only flushed the session and
relied on get_session() to commit. With Tornado/a2wsgi, that cleanup
can fail to run, so the row changes were not persisted even though the
routes returned 200/201.

- Explicitly commit after creating or revoking an API token.
- Filter list/count queries to active (non-revoked, non-expired) tokens
  so revoked tokens no longer appear in the frontend profile list.
- Add a test verifying a revoked token is removed from the list.
feat(player): add persistent playback bar, engine, and history reporting
Some checks failed
continuous-integration/drone/push Build is failing
c67be39a36
- Implement PlayerEngine with gapless preload and HistoryReporter listen pings
- Add PlayerBar UI (now playing, controls, progress, volume, queue panel)
- Add media session integration and shared AppSlider + time formatting util
- Expand player store with queue/shuffle/repeat, persistence, and engine wiring
- Implement history API client and add unit tests for player, engine, and media
- Add albums/artists/tracks/libraries/playlists/favorites/shares API functions
- Add Vitest coverage for API modules, URL builder, and FormData handling
- Localize player aria-labels and expand en translations
- Add npm type-check script
- Add Album/Artist/Library/Playlist card components + specs
- Add TrackList with context menu actions and player queue integration + spec
- Add useEntityList/useOwnership composables + specs
- Add track-to-queue enrichment helpers for player integration
- Wrap long lines in Vue templates, TS modules, and tests
Run the project's Prettier binary on staged files under frontend/src/
when committing, matching the scope of the existing npm run format
script. --ignore-unknown keeps it from failing on unexpected files.
- Add ArtistsView, AlbumsView, TracksView, PlaylistsView, and LibraryView.
- Wire list routes in the router, replacing placeholder pages.
- Add authenticated create playlist/library modals with visibility selection.
- Add i18n keys for creation toasts and modal labels.
- Add view tests for mount, search, empty, error, load-more, and create flows.
- Add retry banner tests for albums/tracks
- Add load-more pagination tests for libraries/playlists
- Set SearchBar debounce to 0 to avoid double-debounce
- Rename Library header to "Libraries" i18n key
feat(frontend): add detail views for browse entities
All checks were successful
continuous-integration/drone/push Build is passing
13bd539ad7
- Add Album/Artist/Track/Playlist/Library detail pages with loading/error states
- Add useEntityMeta composable for owner/visibility labels
- Replace router placeholders with real detail routes
- Add vitest coverage for new views and composable
- Update i18n strings and eslint ignore patterns
feat(frontend): add edit views for albums, tracks, and libraries
All checks were successful
continuous-integration/drone/push Build is passing
e9b84f450d
- Add AlbumEditView, TrackEditView, and LibraryEditView with tests
- Replace edit route placeholders with real routes
- Add useTrackEnrichment composable and refactor LibraryDetailView
- Make useOwnership accept reactive owner ids
- Add entity helpers for number/visibility parsing and scan i18n messages
feat(frontend): add sharing dialog and public share view
All checks were successful
continuous-integration/drone/push Build is passing
1becb381d8
- Add ShareDialog with grants + public link management and clipboard copy
- Add share route + ShareView with defensive payload parsing and enrichment
- Wire share actions into track/album/artist/library/playlist views
- Add share utilities, composable, i18n strings, and tests
- Implement radios list/create/get and tracks fetch with tests
- Switch file upload to XHR for progress + localized error handling
- Add getFile API and tests; extend i18n upload error strings
- Replace placeholders with real routes for history, favorites, files, radio, about
- Add placeholder view components for new routes
- Extend router guard tests for public routes and file detail redirect
feat(frontend): implement history view with pagination, search, and playback
Some checks failed
continuous-integration/drone/push Build is failing
76312949f0
- Add i18n strings for history UI
- Wire history API paging and play again/play all actions with toasts
- Add HistoryView unit tests
- Document pagination edge case when total is unknown
feat: implement favorites tracks view with pagination and removal
All checks were successful
continuous-integration/drone/push Build is passing
3c3e3554fc
- Add favorites i18n strings and gated tabs UI
- Fetch and enrich favorited tracks; handle empty/error/retry states
- Support custom favorite label in TrackList and add view tests
- Update API client paths and unit tests to use `/.../`
- Enable Vite proxy autoRewrite for `/api`
feat(frontend): add file upload and file detail views
Some checks failed
continuous-integration/drone/push Build is failing
7ebf769436
- Add FilesView upload form with visibility and progress
- Add FileDetailView metadata display, download, and sha256 copy
- Add formatBytes helper and unit tests
- Add i18n strings and update architecture docs
- Add i18n strings and update architecture docs
- Add unit tests for RadioView interactions and states
- Register instance routers in FastAPI app
- Add /api/v1/instance/peers endpoint
- Document instance endpoint and add API tests
- Add /api/v1/instance client and tests
- Render instance info with fallbacks and docs/support links
- Extend API types and add About page i18n strings
- Add instance store to load/caches instance metadata + registration flags
- Use store in router guard and About view; add docs/support env example
- Add tests for instance store and registration guard behavior
Adds @fortawesome/fontawesome-free and introduces AppIcon and
AppPageTitle components. Icons are now used in the main navigation,
admin navigation, panel titles/headers, playback controls, context
menus, buttons, and key action links to make the UI easier to scan.
Standalone /files/upload now creates a track, artist, album, upload and
default Uploads library for audio/mpeg (and other audio/*) files. The
resulting track id is returned in an X-Track-Id header, and the frontend
navigates to the new track after a successful audio upload. This prevents
audio files uploaded through the Files page from becoming orphaned and
disappearing, and makes them visible in Tracks/Albums/Artists.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- Support title prop for tooltip/aria-label on AppButton
- Use icon-only logout button and adjust layout widths in AppLayout
- Add optional library_id to files upload; enforce 404/403 on target
- Return can_write on library responses for client-side permission checks
- Extend API tests for library targeting and can_write flag
- Populate a Library dropdown from writable libraries returned by the API
- Pass the selected library_id to the files upload endpoint
- Regenerate OpenAPI types to include LibraryResponse.can_write and upload library_id
- Update tests and fixtures for the new can_write field
- Add title tooltips across player, track list, pagination, and history actions
- Extend AppButton with ariaLabel prop and default aria-label fallback to title
- Update mobile menu toggle labels/expanded state and add i18n strings
- Adjust tests for new aria-label behavior
- Add GET /api/v1/files/ to list visible StoredFile rows
- Implement list/count queries with ACL filter and filename search
- Add API tests and update architecture docs for new endpoints
- Introduce --color-bg-hover token for light/dark themes
- Use token for hover styles in cards, nav, table, menu, and buttons
- Add boxed section border styling in App.vue
- Ignore CSS files in ESLint config
feat(frontend): add files listing view and improve nav active states
All checks were successful
continuous-integration/drone/push Build is passing
13e7123b74
- Implement /files listing API client and FilesView list/search/load more UI
- Add skeleton/empty/error states and file list item metadata
- Fix exact-active highlighting for Home and Admin dashboard links
- Update i18n browse entities and add layout/files view tests
- Replace Vite icon with favicon.ico and add public logo asset
- Show instance title and logo in AppLayout and AuthLayout
- Add instanceStore.name computed with fallback to Songhive
- Resolve track IDs from track_ids/album_id/artist_id with access checks
- Add music helpers to fetch track IDs and insert playlist/library tracks
- Log audit events for added tracks
- Add API tests for library and playlist add flows
- Add APIs to add tracks by track/album/artist to libraries and playlists
- Add AddToCollectionDialog and wire into views and TrackList context menu
- Add i18n strings and update playlist icons; extend TrackList tests
- Update architecture docs for expanded libraries/playlists endpoints
Add backend endpoints to remove tracks from libraries and playlists,
list playlist tracks, and corresponding service helpers. Update
TrackList with a removable collection context, a context-menu remove
action, and a bulk-edit toolbar with checkboxes and confirmation.
Wire the feature into LibraryDetailView and PlaylistView, add
AppCheckbox component, and update tests/i18n.
feat(api): add cascade deletion service and recursive delete endpoints
All checks were successful
continuous-integration/drone/push Build is passing
c085f5d576
- Add services/deletion.py for centralized cascade deletion + unpublish info
- Wire DELETE routes for tracks/files/albums/artists/playlists/libraries
- Default album deletion to recursive; add recursive query param elsewhere
- Update architecture docs and add cascade deletion tests
- Add UserRole import and include role field in UserResponse
- Add DeleteModal and delete composables (single + bulk) with permission checks
- Add delete APIs for artists, playlists, files; add recursive flags for albums/libraries
- Wire delete UI into album/artist/library/playlist/file/track views and TrackList
- Update i18n strings and auth role typing; adjust OpenAPI types and tests
- Keep StoredFile rows when storage backend deletion fails so the
  cleanup task can retry instead of orphaning the backing object.
- Pre-check artist track ownership before recursive delete to avoid
  partial cascades on mixed-ownership artists.
- Delete LibraryTrack rows explicitly before deleting a library.
- Preserve caller input order in remove_library_tracks and
  remove_playlist_tracks.
- Collapse duplicated audit log branches in track deletion.
- Reuse TrackResponse.model_validate in playlist track responses.
- Add tests for artist partial delete, storage delete failure, and
  remove input order.
- Add per-user rate_limit_account on media DELETE endpoints
- Add DELETE /tracks/bulk route and deletion service helper
- Lock StoredFile row during delete to avoid refcount races
- Update ARCHITECTURE docs for bulk delete and rate limiting
- add bulk /tracks delete tests (success, forbidden, missing, rate limit)
- add FOR UPDATE and album cover stored-file deletion regression tests
- add rate-limit coverage for delete endpoints (track/album/artist/playlist/library/file)
- add BulkEditableGrid for shared bulk select/delete UI
- refactor album/artist/library/playlist/files views to use the new grid
- add /tracks/bulk DELETE client and update TrackList to use it
- add tests for BulkEditableGrid, AddToCollectionDialog, and bulk track delete
The height of the logo element now fits the height of the image.
- Add VITE_ALLOWED_HOSTS parsing with default domain allowlist
- Add ellipsis + title tooltips across library cards and track list
- Add fixed column widths support to AppTable
- Improve wrapping/margins in page headers and auth layout logo
- Anchor track list menu to trigger bounds instead of raw pointer coords
- Flip/clamp menu when it would overflow; hide until positioned
- Add resize handling, max-height scrolling, and viewport positioning tests
feat(frontend): add track download to tracklist context menu
All checks were successful
continuous-integration/drone/push Build is passing
25f444d6ff
Tracks with a backing audio file now show a Download item in the
tracklist context menu. The download uses the existing file download
endpoint, includes the bearer token when the user is authenticated,
requests an attachment disposition, and triggers a browser save via a
temporary object URL. A failure surfaces a localized toast.

- Add downloadTrack() helper in api/tracks.ts
- Add download item to TrackList context menu (shown when audio_url)
- Wire menu selection to downloadTrack() with error handling
- Add common.download and browse.download.error i18n strings
- Add/extend unit tests for the API helper and TrackList behavior
blacklight changed title from WIP: Initial frontend implementation to Initial frontend implementation 2026-08-26 02:21:41 +02:00
blacklight deleted branch frontend 2026-08-26 02:21:47 +02:00
Sign in to join this conversation.
No description provided.