Skip to content

feat: Frontend full migration to the new visual language#3436

Draft
zurdi15 wants to merge 212 commits into
masterfrom
chore/frontend-v2
Draft

feat: Frontend full migration to the new visual language#3436
zurdi15 wants to merge 212 commits into
masterfrom
chore/frontend-v2

Conversation

@zurdi15
Copy link
Copy Markdown
Member

@zurdi15 zurdi15 commented May 26, 2026

Description
Explain the changes or enhancements you are proposing with this pull request.

Checklist
Please check all that apply.

  • I've tested the changes locally
  • I've updated relevant comments
  • I've assigned reviewers for this PR
  • I've added unit tests that cover the changes

Screenshots (if applicable)

home platform_index collection_index details settings scan play

zurdi15 and others added 30 commits April 17, 2026 16:02
Backend
- Extract audio tags + duration via mutagen at upload/scan time, store as
  rom_files.audio_meta JSON. Frontend reads everything from the DB instead of
  downloading every blob to parse ID3 client-side.
- Persist embedded cover art under resources/roms/{platform_id}/{rom_id}/
  soundtracks/{file_id}.{ext} on upload/scan; store relative path in
  audio_meta.cover_path. Cleaned up on delete. Removed the on-the-fly
  /soundtracks/{file_id}/cover endpoint (DB is source of truth).
- New GET /roms/{id}/soundtracks/metadata returns the compact per-ROM
  metadata payload.
- Fix /files/content/{name}: serve audio inline with proper MIME
  (audio/flac, audio/ogg, audio/mp4, ...) and let Starlette handle Range
  natively in DEV_MODE. Browsers can now seek and progressively stream;
  scrubbing returns 206 Partial Content instead of pulling the whole file.
- Squashed the audio_meta column into the existing 0080 migration.

Frontend
- Drop jsmediatags entirely.
- New persistent SoundtrackMiniPlayer + reusable VolumeControl components.
- Pinia store: loadPlaylistForRom, activePlaylistRomId, throttled
  reportCurrentTime (200 ms), isBuffering driven by waiting/canplay events.
- SoundtrackPlayer reads metadata via one JSON request (AbortController on
  unmount/track change), shows per-track + total durations, lazy-loads
  thumbnails, resolves covers via the static resources path.
- Wrap most scoped CSS into Vuetify utility classes.

Tests
- 12 backend tests covering upload extraction + cover persist, metadata
  endpoint shape, delete cleanup, range support.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…layer functionality

- Introduced a new fixture `multi_file_rom` in `conftest.py` to create a ROM with multiple files for testing purposes.
- Updated `test_manual.py` and `test_soundtrack.py` to utilize the new fixture for testing manual uploads and soundtrack functionalities.
- Enhanced the audio tag extraction logic in `audio_tags.py` to handle oversized audio files and added a function to check allowed audio file extensions.
- Modified `nginx.py` to support inline file serving for audio files, allowing for better streaming capabilities.
- Improved error handling in the Vue components for soundtrack management, including user feedback for playback errors and metadata loading issues.
- Refactored the soundtrack player store to use local storage for volume and mute settings, simplifying state management.
- Added new localization strings for soundtrack player actions and error messages in both English (US and GB) locale files.
Bring in manual/soundtrack backend + shared frontend code so v2 can expose
the new media features. Resolved RomM.vue by keeping both the v2 gate and
the app-wide SoundtrackMiniPlayer; took the branch's uv.lock.
…ton styles

feat: add PlatformsIndex.vue for displaying a grid of platforms with loading skeletons

fix: update bcrypt version to 4.0.1 and adjust dependencies in uv.lock
… and usability

- Introduced AuthCard component to standardize the layout of authentication views.
- Added AuthBackLink component for consistent navigation back to the login page.
- Replaced password input fields in Login, Register, and ResetPassword views with PasswordField component for better encapsulation of show/hide functionality.
- Removed GameContextMenu component and related context menu logic, transitioning to MoreMenu for per-ROM actions.
- Updated AppLayout and AuthLayout to utilize useThemeClass for theme management.
- Cleaned up unused variables and styles across various components to enhance maintainability.
…ndex and PlatformsIndex to use new components
…brary management, metadata sources, server stats, user interface, and user profile

- Implemented Administration view with UsersTable, TokensTable, and Tasks components.
- Created ClientApiTokens view with ClientTokensTable component.
- Developed LibraryManagement view with tabs for FolderMappings, Excluded, and MissingGames.
- Added MetadataSources view displaying API key and connection status for various metadata providers.
- Introduced ServerStats view for displaying library-wide totals and per-platform breakdowns.
- Established UserInterface view for toggling between v1 and v2 UI versions, theme selection, and language settings.
- Rewrote UserProfile view for managing account details, avatar, and linked services, integrating RetroAchievements component.
- Implemented RSliderBtnGroup as a segmented/tab control with a sliding indicator.
- Created stories for different variants: Segmented, Tab, and Disabled.
- Added types for SliderBtnGroupItem to define item structure.
- Introduced RSpinner component for inline loading states with stories.
- Developed RList and RListItem components with stories for list display.
- Created RToolbar component for toolbar layout with customizable properties.
- Added RTooltip component for tooltips with various activator patterns.
- Updated imports in EmulatorJS and LibraryManagement views to reflect new component paths.
…m styling

Co-authored-by: Copilot <copilot@github.com>
zurdi15 added 24 commits May 25, 2026 10:36
…ooltip handling and virtual scrolling support
… improved metadata selection

- Refactor ScanPlatform.vue to always use RVirtualScroller for listing ROMs, improving performance and layout consistency.
- Introduce a maximum viewport height for the virtual scroller to prevent excessive DOM growth.
- Update ScanPlatformRow.vue to make each ROM row a clickable router link, enhancing navigation to ROM details.
- Add a synthetic "All" option in RSelect for metadata sources, allowing users to toggle all items in multi-select mode.
- Split metadata providers into general and specific categories for clearer organization in the Scan view.
- Improve styling and layout of the scan configuration card for better user experience.
…ty for virtual scrolling and padding behavior
- Adjust padding in CollectionPickerRow and NewCollectionRow for a more compact layout.
- Introduce GameCard component in ManageCollectionsDialog for better visual representation of single ROMs.
- Implement SiblingBadge in GameCard to display sibling versions of ROMs.
- Add MainSiblingToggle and VersionSwitcher components to GameHeader for managing default versions and switching between ROM versions.
- Refactor CollectionSettingsDrawer to remove delete functionality, moving it to Collection.vue for consistency with other gallery surfaces.
- Enhance CollectionsIndex with specific empty state messages based on search and filter criteria.
- Update UserInterface settings to remove showSiblings toggle, integrating sibling display into groupRoms functionality.
- Introduced ResumePanel component for managing saves and states in the EmulatorJS player view.
- Implemented storybook stories for various scenarios including rich library, overflow states, and fresh game.
- Refactored EmulatorJS.vue to utilize AssetList, AssetPreview, and AssetStrip components for improved asset management.
- Enhanced layout and styling for better user experience across different screen sizes.
…e, and enhance package.json with npm version specification
…tering and context handling

- Updated CreateSmartCollectionDialog to include current collection and virtual collection IDs for better context.
- Enhanced RefreshMetadataDialog with new hash matcher options and improved UI for metadata sources selection.
- Improved SearchCoverDialog to conditionally display provider covers based on selected cover type.
- Added collection and virtual collection lookups in CollectionSettingsDrawer for better filter summaries.
- Updated MatchRom components to handle cases where matches may not have covers, improving user feedback.
- Enhanced smart collection criteria handling in utils to support additional context and summary lookups.
…ved UI

- Updated UploadFirmwareDialog.vue to implement a primary drop zone for file uploads, enhancing user experience by allowing drag-and-drop functionality.
- Removed automatic file picker trigger on dialog open, focusing on the drop zone as the main interaction method.
- Improved visual design of the upload area, including empty and filled states, and added animations for better feedback.
- Refactored file handling logic to prevent duplicate file selections and streamline the upload process.
- Adjusted styles for better alignment and spacing in the upload dialog.

feat: add tooltips to game action buttons for better accessibility

- Integrated RTooltip into GameActionBtn.vue to provide descriptive tooltips for buttons without labels, improving usability for users relying on screen readers or hover information.

refactor: restructure Platform.vue for better tab management and UI consistency

- Reorganized Platform.vue to implement a tabbed interface for navigating between Library, Firmware, and Settings views.
- Introduced PlatformHead component to encapsulate header functionality, improving code readability and maintainability.
- Updated state management for tab selection, ensuring URL persistence and seamless navigation.
- Enhanced platform metadata fetching logic to keep the UI in sync with the latest data.
- Removed deprecated components and streamlined the layout for better performance and user experience.
- Remove EditPlatformDialog.vue and integrate editing functionality directly into SettingsTab.vue.
- Update PlatformHead.vue to remove edit and delete actions, moving them to the Settings tab.
- Enhance SettingsTab.vue with editable platform name and danger zone for deletion.
- Adjust Collection.vue to reflect changes in settings management and remove unnecessary components.
- Refactor CollectionHead.vue to accommodate new settings structure.
- Improve ScanPlatformDialog.vue for better ROM count display.
@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 26, 2026

@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 26, 2026

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm js-beautify is 100.0% likely obfuscated

Confidence: 1.00

Location: Package overview

From: frontend/package-lock.jsonnpm/@vue/test-utils@2.4.9npm/js-beautify@1.15.4

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/js-beautify@1.15.4. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

Test Results (postgresql)

    1 files  ± 0      1 suites  ±0   4m 8s ⏱️ +2s
1 443 tests +40  1 443 ✅ +40  0 💤 ±0  0 ❌ ±0 
1 445 runs  +40  1 445 ✅ +40  0 💤 ±0  0 ❌ ±0 

Results for commit 31f0190. ± Comparison against base commit c261d5e.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

Test Results (mariadb)

    1 files  ± 0      1 suites  ±0   4m 11s ⏱️ +14s
1 443 tests +40  1 443 ✅ +40  0 💤 ±0  0 ❌ ±0 
1 445 runs  +40  1 445 ✅ +40  0 💤 ±0  0 ❌ ±0 

Results for commit 31f0190. ± Comparison against base commit c261d5e.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

☂️ Python Coverage

current status: ✅

Overall Coverage

Lines Covered Coverage Threshold Status
16966 11945 70% 0% 🟢

New Files

File Coverage Status
backend/endpoints/roms/soundtrack.py 84% 🟢
backend/utils/audio_tags.py 32% 🟢
TOTAL 58% 🟢

Modified Files

File Coverage Status
backend/endpoints/heartbeat.py 77% 🟢
backend/endpoints/responses/client_token.py 100% 🟢
backend/endpoints/responses/rom.py 94% 🟢
backend/endpoints/roms/_init_.py 63% 🟢
backend/endpoints/roms/files.py 56% 🟢
backend/endpoints/roms/manual.py 75% 🟢
backend/endpoints/sockets/scan.py 23% 🟢
backend/handler/database/roms_handler.py 60% 🟢
backend/handler/filesystem/base_handler.py 94% 🟢
backend/handler/filesystem/roms_handler.py 77% 🟢
backend/handler/scan_handler.py 63% 🟢
backend/models/rom.py 93% 🟢
backend/utils/client_tokens.py 97% 🟢
backend/utils/nginx.py 61% 🟢
TOTAL 74% 🟢

updated for commit: 31f0190 by action🐍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant