From a4e8d9df49c9df0bb7599a305dda65e7478e8b69 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 10 Mar 2026 20:09:19 -0400 Subject: [PATCH] fix: sort without mutating store, move constants to module scope - Spread allPlatforms before sorting to avoid mutating Pinia store - Move _METADATA_SOURCE_COLUMNS to module level - Add optional chain on sourceInfo v-img src Co-Authored-By: Claude Opus 4.6 --- backend/handler/database/stats_handler.py | 32 +++++++++---------- .../Settings/ServerStats/PlatformsStats.vue | 8 ++--- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/backend/handler/database/stats_handler.py b/backend/handler/database/stats_handler.py index 18a2b8916..0276fa2e9 100644 --- a/backend/handler/database/stats_handler.py +++ b/backend/handler/database/stats_handler.py @@ -10,6 +10,20 @@ from models.rom import Rom, RomFile from .base_handler import DBBaseHandler +# Metadata source columns on the Rom model, keyed by source identifier. +_METADATA_SOURCE_COLUMNS: dict[str, InstrumentedAttribute] = { + "igdb": Rom.igdb_id, + "ss": Rom.ss_id, + "moby": Rom.moby_id, + "launchbox": Rom.launchbox_id, + "ra": Rom.ra_id, + "hasheous": Rom.hasheous_id, + "tgdb": Rom.tgdb_id, + "flashpoint": Rom.flashpoint_id, + "hltb": Rom.hltb_id, + "gamelist": Rom.gamelist_id, +} + class DBStatsHandler(DBBaseHandler): @begin_session @@ -83,20 +97,6 @@ class DBStatsHandler(DBBaseHandler): or 0 ) - # Metadata source columns on the Rom model, keyed by source identifier. - METADATA_SOURCE_COLUMNS: dict[str, "InstrumentedAttribute"] = { - "igdb": Rom.igdb_id, - "ss": Rom.ss_id, - "moby": Rom.moby_id, - "launchbox": Rom.launchbox_id, - "ra": Rom.ra_id, - "hasheous": Rom.hasheous_id, - "tgdb": Rom.tgdb_id, - "flashpoint": Rom.flashpoint_id, - "hltb": Rom.hltb_id, - "gamelist": Rom.gamelist_id, - } - @begin_session def get_metadata_coverage_by_platform( self, @@ -108,7 +108,7 @@ class DBStatsHandler(DBBaseHandler): Rom.platform_id, *( func.count(col).label(key) - for key, col in self.METADATA_SOURCE_COLUMNS.items() + for key, col in _METADATA_SOURCE_COLUMNS.items() ), ) .select_from(Rom) @@ -119,7 +119,7 @@ class DBStatsHandler(DBBaseHandler): for row in rows: result[row.platform_id] = [ {"source": key, "matched": getattr(row, key)} - for key in self.METADATA_SOURCE_COLUMNS + for key in _METADATA_SOURCE_COLUMNS if getattr(row, key) > 0 ] return result diff --git a/frontend/src/components/Settings/ServerStats/PlatformsStats.vue b/frontend/src/components/Settings/ServerStats/PlatformsStats.vue index b2bced2f4..8f5daf51a 100644 --- a/frontend/src/components/Settings/ServerStats/PlatformsStats.vue +++ b/frontend/src/components/Settings/ServerStats/PlatformsStats.vue @@ -23,14 +23,14 @@ const orderBy = ref<"name" | "size" | "count">("name"); const sortedPlatforms = computed(() => { if (orderBy.value === "size") { - return allPlatforms.value.sort( + return [...allPlatforms.value].sort( (a, b) => Number(b.fs_size_bytes) - Number(a.fs_size_bytes), ); } if (orderBy.value === "count") { - return allPlatforms.value.sort((a, b) => b.rom_count - a.rom_count); + return [...allPlatforms.value].sort((a, b) => b.rom_count - a.rom_count); } - return allPlatforms.value.sort((a, b) => + return [...allPlatforms.value].sort((a, b) => a.display_name.localeCompare(b.display_name, undefined, { sensitivity: "base", }), @@ -217,7 +217,7 @@ function getCoveragePercent(matched: number, total: number): string { size="12" rounded > - + {{ getCoveragePercent(item.matched, platform.rom_count) }}%