From a9560082596e60b5cbcb7246618c0d64ea41cdfb Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 25 Dec 2025 11:52:00 +0000 Subject: [PATCH] feat: update ROM filtering to support multi-value statuses and logic operators --- backend/endpoints/rom.py | 27 +++--- .../handler/database/collections_handler.py | 3 +- backend/handler/database/roms_handler.py | 40 +++++---- .../AppBar/common/FilterDrawer/Base.vue | 85 ++----------------- frontend/src/services/api/rom.ts | 65 ++++++++------ frontend/src/services/cache/api.ts | 58 ++++++++----- frontend/src/stores/galleryFilter.ts | 48 ----------- frontend/src/stores/roms.ts | 1 + 8 files changed, 125 insertions(+), 202 deletions(-) diff --git a/backend/endpoints/rom.py b/backend/endpoints/rom.py index 55e557eed..5121eb469 100644 --- a/backend/endpoints/rom.py +++ b/backend/endpoints/rom.py @@ -262,7 +262,6 @@ def get_roms( "Associated genre. Multiple values are allowed by repeating the" " parameter, and results that match any of the values will be returned." ), - alias="genre", ), ] = None, franchises: Annotated[ @@ -272,7 +271,6 @@ def get_roms( "Associated franchise. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="franchise", ), ] = None, collections: Annotated[ @@ -282,7 +280,6 @@ def get_roms( "Associated collection. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="collection", ), ] = None, companies: Annotated[ @@ -292,7 +289,6 @@ def get_roms( "Associated company. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="company", ), ] = None, age_ratings: Annotated[ @@ -302,12 +298,16 @@ def get_roms( "Associated age rating. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="age_rating", ), ] = None, - selected_status: Annotated[ - str | None, - Query(description="Game status, set by the current user."), + selected_statuses: Annotated[ + list[str] | None, + Query( + description=( + "Game status, set by the current user. Multiple values are allowed by repeating" + " the parameter, and results that match any of the values will be returned." + ), + ), ] = None, regions: Annotated[ list[str] | None, @@ -316,7 +316,6 @@ def get_roms( "Associated region tag. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="region", ), ] = None, languages: Annotated[ @@ -326,7 +325,6 @@ def get_roms( "Associated language tag. Multiple values are allowed by repeating" " the parameter, and results that match any of the values will be returned." ), - alias="language", ), ] = None, # Logic operators for multi-value filters @@ -372,6 +370,12 @@ def get_roms( description="Logic operator for languages filter: 'any' (OR) or 'all' (AND).", ), ] = "any", + statuses_logic: Annotated[ + str, + Query( + description="Logic operator for statuses filter: 'any' (OR) or 'all' (AND).", + ), + ] = "any", order_by: Annotated[ str, Query(description="Field to order results by."), @@ -409,7 +413,7 @@ def get_roms( collections=collections, companies=companies, age_ratings=age_ratings, - selected_status=selected_status, + selected_statuses=selected_statuses, regions=regions, languages=languages, # Logic operators @@ -420,6 +424,7 @@ def get_roms( age_ratings_logic=age_ratings_logic, regions_logic=regions_logic, languages_logic=languages_logic, + statuses_logic=statuses_logic, group_by_meta_id=group_by_meta_id, ) diff --git a/backend/handler/database/collections_handler.py b/backend/handler/database/collections_handler.py index 16fe2a66b..82798dc47 100644 --- a/backend/handler/database/collections_handler.py +++ b/backend/handler/database/collections_handler.py @@ -291,7 +291,7 @@ class DBCollectionsHandler(DBBaseHandler): collections=collections, companies=companies, age_ratings=age_ratings, - selected_status=criteria.get("selected_status"), + selected_statuses=criteria.get("selected_statuses"), regions=regions, languages=languages, # Logic operators for multi-value filters @@ -302,6 +302,7 @@ class DBCollectionsHandler(DBBaseHandler): age_ratings_logic=criteria.get("age_ratings_logic", "any"), regions_logic=criteria.get("regions_logic", "any"), languages_logic=criteria.get("languages_logic", "any"), + statuses_logic=criteria.get("statuses_logic", "any"), user_id=user_id, order_by=criteria.get("order_by", "name"), order_dir=criteria.get("order_dir", "asc"), diff --git a/backend/handler/database/roms_handler.py b/backend/handler/database/roms_handler.py index f274e914f..ea18d1931 100644 --- a/backend/handler/database/roms_handler.py +++ b/backend/handler/database/roms_handler.py @@ -401,19 +401,27 @@ class DBRomsHandler(DBBaseHandler): op = json_array_contains_all if match_all else json_array_contains_any return query.filter(op(RomMetadata.age_ratings, values, session=session)) - def filter_by_status(self, query: Query, selected_status: str): - status_filter = RomUser.status == selected_status - if selected_status == "now_playing": - status_filter = RomUser.now_playing.is_(True) - elif selected_status == "backlogged": - status_filter = RomUser.backlogged.is_(True) - elif selected_status == "hidden": - status_filter = RomUser.hidden.is_(True) + def filter_by_status(self, query: Query, selected_statuses: Sequence[str]): + """Filter by one or more user statuses using OR logic.""" + if not selected_statuses: + return query - if selected_status == "hidden": - return query.filter(status_filter) + status_filters = [] + for selected_status in selected_statuses: + if selected_status == "now_playing": + status_filters.append(RomUser.now_playing.is_(True)) + elif selected_status == "backlogged": + status_filters.append(RomUser.backlogged.is_(True)) + elif selected_status == "hidden": + status_filters.append(RomUser.hidden.is_(True)) + else: + status_filters.append(RomUser.status == selected_status) - return query.filter(status_filter, RomUser.hidden.is_(False)) + # If hidden is in the list, don't apply the hidden filter at the end + if "hidden" in selected_statuses: + return query.filter(or_(*status_filters)) + + return query.filter(or_(*status_filters), RomUser.hidden.is_(False)) def filter_by_regions( self, @@ -459,7 +467,7 @@ class DBRomsHandler(DBBaseHandler): collections: Sequence[str] | None = None, companies: Sequence[str] | None = None, age_ratings: Sequence[str] | None = None, - selected_status: str | None = None, + selected_statuses: Sequence[str] | None = None, regions: Sequence[str] | None = None, languages: Sequence[str] | None = None, # Logic operators for multi-value filters @@ -470,6 +478,7 @@ class DBRomsHandler(DBBaseHandler): age_ratings_logic: str = "any", regions_logic: str = "any", languages_logic: str = "any", + statuses_logic: str = "any", user_id: int | None = None, session: Session = None, # type: ignore ) -> Query[Rom]: @@ -648,8 +657,8 @@ class DBRomsHandler(DBBaseHandler): ) # The RomUser table is already joined if user_id is set - if selected_status and user_id: - query = self.filter_by_status(query, selected_status) + if selected_statuses and user_id: + query = self.filter_by_status(query, selected_statuses) elif user_id: query = query.filter( or_(RomUser.hidden.is_(False), RomUser.hidden.is_(None)) @@ -732,7 +741,7 @@ class DBRomsHandler(DBBaseHandler): collections=kwargs.get("collections", None), companies=kwargs.get("companies", None), age_ratings=kwargs.get("age_ratings", None), - selected_status=kwargs.get("selected_status", None), + selected_statuses=kwargs.get("selected_statuses", None), regions=kwargs.get("regions", None), languages=kwargs.get("languages", None), # Logic operators for multi-value filters @@ -743,6 +752,7 @@ class DBRomsHandler(DBBaseHandler): age_ratings_logic=kwargs.get("age_ratings_logic", "any"), regions_logic=kwargs.get("regions_logic", "any"), languages_logic=kwargs.get("languages_logic", "any"), + statuses_logic=kwargs.get("statuses_logic", "any"), user_id=kwargs.get("user_id", None), ) return session.scalars(roms).all() diff --git a/frontend/src/components/Gallery/AppBar/common/FilterDrawer/Base.vue b/frontend/src/components/Gallery/AppBar/common/FilterDrawer/Base.vue index edcdc417d..05c902fcd 100644 --- a/frontend/src/components/Gallery/AppBar/common/FilterDrawer/Base.vue +++ b/frontend/src/components/Gallery/AppBar/common/FilterDrawer/Base.vue @@ -50,36 +50,28 @@ const { filterRA, filterMissing, filterVerified, - selectedGenre, filterGenres, selectedGenres, genresLogic, - selectedFranchise, filterFranchises, selectedFranchises, franchisesLogic, - selectedCollection, filterCollections, selectedCollections, collectionsLogic, - selectedCompany, filterCompanies, selectedCompanies, companiesLogic, - selectedAgeRating, filterAgeRatings, selectedAgeRatings, ageRatingsLogic, - selectedStatus, filterStatuses, selectedStatuses, statusesLogic, selectedPlatforms, - selectedRegion, filterRegions, selectedRegions, regionsLogic, - selectedLanguage, filterLanguages, selectedLanguages, languagesLogic, @@ -97,98 +89,61 @@ const onFilterChange = debounce( Object.entries({ search: searchTerm.value, matched: - filterMatched.value === true - ? "true" - : filterMatched.value === false - ? "false" - : null, + filterMatched.value === null ? null : String(filterMatched.value), filterFavorites: - filterFavorites.value === true - ? "true" - : filterFavorites.value === false - ? "false" - : null, + filterFavorites.value === null ? null : String(filterFavorites.value), filterDuplicates: - filterDuplicates.value === true - ? "true" - : filterDuplicates.value === false - ? "false" - : null, + filterDuplicates.value === null ? null : String(filterDuplicates.value), filterPlayables: - filterPlayables.value === true - ? "true" - : filterPlayables.value === false - ? "false" - : null, + filterPlayables.value === null ? null : String(filterPlayables.value), filterMissing: - filterMissing.value === true - ? "true" - : filterMissing.value === false - ? "false" - : null, + filterMissing.value === null ? null : String(filterMissing.value), filterVerified: - filterVerified.value === true - ? "true" - : filterVerified.value === false - ? "false" - : null, - filterRA: - filterRA.value === true - ? "true" - : filterRA.value === false - ? "false" - : null, + filterVerified.value === null ? null : String(filterVerified.value), + filterRA: filterRA.value === null ? null : String(filterRA.value), platforms: selectedPlatforms.value.length > 0 ? selectedPlatforms.value.map((p) => String(p.id)).join(",") : null, - genre: selectedGenre.value, genres: selectedGenres.value.length > 0 ? selectedGenres.value.join(",") : null, genresLogic: selectedGenres.value.length > 1 ? genresLogic.value : null, - franchise: selectedFranchise.value, franchises: selectedFranchises.value.length > 0 ? selectedFranchises.value.join(",") : null, franchisesLogic: selectedFranchises.value.length > 1 ? franchisesLogic.value : null, - collection: selectedCollection.value, collections: selectedCollections.value.length > 0 ? selectedCollections.value.join(",") : null, collectionsLogic: selectedCollections.value.length > 1 ? collectionsLogic.value : null, - company: selectedCompany.value, companies: selectedCompanies.value.length > 0 ? selectedCompanies.value.join(",") : null, companiesLogic: selectedCompanies.value.length > 1 ? companiesLogic.value : null, - ageRating: selectedAgeRating.value, ageRatings: selectedAgeRatings.value.length > 0 ? selectedAgeRatings.value.join(",") : null, ageRatingsLogic: selectedAgeRatings.value.length > 1 ? ageRatingsLogic.value : null, - region: selectedRegion.value, regions: selectedRegions.value.length > 0 ? selectedRegions.value.join(",") : null, regionsLogic: selectedRegions.value.length > 1 ? regionsLogic.value : null, - language: selectedLanguage.value, languages: selectedLanguages.value.length > 0 ? selectedLanguages.value.join(",") : null, languagesLogic: selectedLanguages.value.length > 1 ? languagesLogic.value : null, - status: selectedStatus.value, statuses: selectedStatuses.value.length > 0 ? selectedStatuses.value.join(",") @@ -409,15 +364,6 @@ onMounted(async () => { filterRA: urlFilteredRa, platform: urlPlatform, platforms: urlPlatforms, - // Single value URL params (backward compatibility) - genre: urlGenre, - franchise: urlFranchise, - collection: urlCollection, - company: urlCompany, - ageRating: urlAgeRating, - region: urlRegion, - language: urlLanguage, - status: urlStatus, // Multi-value URL params genres: urlGenres, genresLogic: urlGenresLogic, @@ -523,9 +469,6 @@ onMounted(async () => { if (urlGenresLogic !== undefined) { galleryFilterStore.setGenresLogic(urlGenresLogic as "any" | "all"); } - } else if (urlGenre !== undefined) { - // Backward compatibility: if single genre is set, convert to multiselect - galleryFilterStore.setSelectedFilterGenres([urlGenre as string]); } if (urlFranchises !== undefined) { @@ -538,8 +481,6 @@ onMounted(async () => { urlFranchisesLogic as "any" | "all", ); } - } else if (urlFranchise !== undefined) { - galleryFilterStore.setSelectedFilterFranchises([urlFranchise as string]); } if (urlCollections !== undefined) { @@ -552,8 +493,6 @@ onMounted(async () => { urlCollectionsLogic as "any" | "all", ); } - } else if (urlCollection !== undefined) { - galleryFilterStore.setSelectedFilterCollections([urlCollection as string]); } if (urlCompanies !== undefined) { @@ -564,8 +503,6 @@ onMounted(async () => { if (urlCompaniesLogic !== undefined) { galleryFilterStore.setCompaniesLogic(urlCompaniesLogic as "any" | "all"); } - } else if (urlCompany !== undefined) { - galleryFilterStore.setSelectedFilterCompanies([urlCompany as string]); } if (urlAgeRatings !== undefined) { @@ -578,8 +515,6 @@ onMounted(async () => { urlAgeRatingsLogic as "any" | "all", ); } - } else if (urlAgeRating !== undefined) { - galleryFilterStore.setSelectedFilterAgeRatings([urlAgeRating as string]); } if (urlRegions !== undefined) { @@ -588,8 +523,6 @@ onMounted(async () => { if (urlRegionsLogic !== undefined) { galleryFilterStore.setRegionsLogic(urlRegionsLogic as "any" | "all"); } - } else if (urlRegion !== undefined) { - galleryFilterStore.setSelectedFilterRegions([urlRegion as string]); } if (urlLanguages !== undefined) { @@ -600,8 +533,6 @@ onMounted(async () => { if (urlLanguagesLogic !== undefined) { galleryFilterStore.setLanguagesLogic(urlLanguagesLogic as "any" | "all"); } - } else if (urlLanguage !== undefined) { - galleryFilterStore.setSelectedFilterLanguages([urlLanguage as string]); } if (urlStatuses !== undefined) { @@ -610,8 +541,6 @@ onMounted(async () => { if (urlStatusesLogic !== undefined) { galleryFilterStore.setStatusesLogic(urlStatusesLogic as "any" | "all"); } - } else if (urlStatus !== undefined) { - galleryFilterStore.setSelectedFilterStatuses([urlStatus as string]); } // Check if search term is set in the URL (empty string is ok) diff --git a/frontend/src/services/api/rom.ts b/frontend/src/services/api/rom.ts index 93dbc9fb7..e6c63634f 100644 --- a/frontend/src/services/api/rom.ts +++ b/frontend/src/services/api/rom.ts @@ -10,8 +10,7 @@ import socket from "@/services/socket"; import storeHeartbeat from "@/stores/heartbeat"; import type { DetailedRom, SimpleRom, SearchRom } from "@/stores/roms"; import storeUpload from "@/stores/upload"; -import { getDownloadPath, getStatusKeyForText } from "@/utils"; -import { getFilterArray } from "@/utils/apiHelpers"; +import { getDownloadPath } from "@/utils"; export const romApi = api; @@ -79,15 +78,6 @@ export interface GetRomsParams { filterMissing?: boolean | null; filterVerified?: boolean | null; groupByMetaId?: boolean; - // Single value filters (for backward compatibility) - selectedGenre?: string | null; - selectedFranchise?: string | null; - selectedCollection?: string | null; - selectedCompany?: string | null; - selectedAgeRating?: string | null; - selectedStatus?: string | null; - selectedRegion?: string | null; - selectedLanguage?: string | null; // Multi-value filters selectedGenres?: string[] | null; selectedFranchises?: string[] | null; @@ -105,6 +95,7 @@ export interface GetRomsParams { ageRatingsLogic?: string | null; regionsLogic?: string | null; languagesLogic?: string | null; + statusesLogic?: string | null; } async function getRoms({ @@ -125,14 +116,6 @@ async function getRoms({ filterMissing = false, filterVerified = false, groupByMetaId = false, - selectedGenre = null, - selectedFranchise = null, - selectedCollection = null, - selectedCompany = null, - selectedAgeRating = null, - selectedStatus = null, - selectedRegion = null, - selectedLanguage = null, selectedGenres = null, selectedFranchises = null, selectedCollections = null, @@ -140,6 +123,7 @@ async function getRoms({ selectedAgeRatings = null, selectedRegions = null, selectedLanguages = null, + selectedStatuses = null, // Logic operators genresLogic = null, franchisesLogic = null, @@ -148,6 +132,7 @@ async function getRoms({ ageRatingsLogic = null, regionsLogic = null, languagesLogic = null, + statusesLogic = null, }: GetRomsParams): Promise<{ data: GetRomsResponse }> { const params = { platform_ids: @@ -161,14 +146,36 @@ async function getRoms({ order_by: orderBy, order_dir: orderDir, group_by_meta_id: groupByMetaId, - genre: getFilterArray(selectedGenre, selectedGenres), - franchise: getFilterArray(selectedFranchise, selectedFranchises), - collection: getFilterArray(selectedCollection, selectedCollections), - company: getFilterArray(selectedCompany, selectedCompanies), - age_rating: getFilterArray(selectedAgeRating, selectedAgeRatings), - selected_status: getStatusKeyForText(selectedStatus), - region: getFilterArray(selectedRegion, selectedRegions), - language: getFilterArray(selectedLanguage, selectedLanguages), + genres: + selectedGenres && selectedGenres.length > 0 ? selectedGenres : undefined, + franchises: + selectedFranchises && selectedFranchises.length > 0 + ? selectedFranchises + : undefined, + collections: + selectedCollections && selectedCollections.length > 0 + ? selectedCollections + : undefined, + companies: + selectedCompanies && selectedCompanies.length > 0 + ? selectedCompanies + : undefined, + age_ratings: + selectedAgeRatings && selectedAgeRatings.length > 0 + ? selectedAgeRatings + : undefined, + selected_statuses: + selectedStatuses && selectedStatuses.length > 0 + ? selectedStatuses + : undefined, + regions: + selectedRegions && selectedRegions.length > 0 + ? selectedRegions + : undefined, + languages: + selectedLanguages && selectedLanguages.length > 0 + ? selectedLanguages + : undefined, // Logic operators genres_logic: selectedGenres && selectedGenres.length > 1 @@ -198,6 +205,10 @@ async function getRoms({ selectedLanguages && selectedLanguages.length > 1 ? languagesLogic || "any" : undefined, + statuses_logic: + selectedStatuses && selectedStatuses.length > 1 + ? statusesLogic || "any" + : undefined, ...(filterMatched !== null ? { matched: filterMatched } : {}), ...(filterFavorites !== null ? { favorite: filterFavorites } : {}), ...(filterDuplicates !== null ? { duplicate: filterDuplicates } : {}), diff --git a/frontend/src/services/cache/api.ts b/frontend/src/services/cache/api.ts index 1dc0bc92d..f68ce171b 100644 --- a/frontend/src/services/cache/api.ts +++ b/frontend/src/services/cache/api.ts @@ -8,8 +8,6 @@ import type { import type { CustomLimitOffsetPage_SimpleRomSchema_ as GetRomsResponse } from "@/__generated__/models/CustomLimitOffsetPage_SimpleRomSchema_"; import type { GetRomsParams } from "@/services/api/rom"; import cacheService from "@/services/cache"; -import { getStatusKeyForText } from "@/utils"; -import { getFilterArray } from "@/utils/apiHelpers"; class CachedApiService { private createRequestConfig( @@ -44,26 +42,38 @@ class CachedApiService { order_by: params.orderBy, order_dir: params.orderDir, group_by_meta_id: params.groupByMetaId, - genre: getFilterArray(params.selectedGenre, params.selectedGenres), - franchise: getFilterArray( - params.selectedFranchise, - params.selectedFranchises, - ), - collection: getFilterArray( - params.selectedCollection, - params.selectedCollections, - ), - company: getFilterArray(params.selectedCompany, params.selectedCompanies), - age_rating: getFilterArray( - params.selectedAgeRating, - params.selectedAgeRatings, - ), - selected_status: getStatusKeyForText(params.selectedStatus ?? null), - region: getFilterArray(params.selectedRegion, params.selectedRegions), - language: getFilterArray( - params.selectedLanguage, - params.selectedLanguages, - ), + genres: + params.selectedGenres && params.selectedGenres.length > 0 + ? params.selectedGenres + : undefined, + franchises: + params.selectedFranchises && params.selectedFranchises.length > 0 + ? params.selectedFranchises + : undefined, + collections: + params.selectedCollections && params.selectedCollections.length > 0 + ? params.selectedCollections + : undefined, + companies: + params.selectedCompanies && params.selectedCompanies.length > 0 + ? params.selectedCompanies + : undefined, + age_ratings: + params.selectedAgeRatings && params.selectedAgeRatings.length > 0 + ? params.selectedAgeRatings + : undefined, + selected_statuses: + params.selectedStatuses && params.selectedStatuses.length > 0 + ? params.selectedStatuses + : undefined, + regions: + params.selectedRegions && params.selectedRegions.length > 0 + ? params.selectedRegions + : undefined, + languages: + params.selectedLanguages && params.selectedLanguages.length > 0 + ? params.selectedLanguages + : undefined, // Logic operators genres_logic: params.selectedGenres && params.selectedGenres.length > 1 @@ -93,6 +103,10 @@ class CachedApiService { params.selectedLanguages && params.selectedLanguages.length > 1 ? params.languagesLogic || "any" : undefined, + statuses_logic: + params.selectedStatuses && params.selectedStatuses.length > 1 + ? params.statusesLogic || "any" + : undefined, ...(params.filterMatched !== null ? { matched: params.filterMatched } : {}), diff --git a/frontend/src/stores/galleryFilter.ts b/frontend/src/stores/galleryFilter.ts index 499e9564e..af86b21a4 100644 --- a/frontend/src/stores/galleryFilter.ts +++ b/frontend/src/stores/galleryFilter.ts @@ -35,21 +35,13 @@ const defaultFilterState = { filterVerified: null as boolean | null, // null = all, true = verified, false = not verified selectedPlatform: null as Platform | null, selectedPlatforms: [] as Platform[], - selectedGenre: null as string | null, selectedGenres: [] as string[], - selectedFranchise: null as string | null, selectedFranchises: [] as string[], - selectedCollection: null as string | null, selectedCollections: [] as string[], - selectedCompany: null as string | null, selectedCompanies: [] as string[], - selectedAgeRating: null as string | null, selectedAgeRatings: [] as string[], - selectedRegion: null as string | null, selectedRegions: [] as string[], - selectedLanguage: null as string | null, selectedLanguages: [] as string[], - selectedStatus: null as string | null, selectedStatuses: [] as string[], // Logic operators for multi-select filters genresLogic: "any" as "any" | "all", @@ -103,72 +95,48 @@ export default defineStore("galleryFilter", { // Clear single platform selection to avoid conflicts this.selectedPlatform = null; }, - setSelectedFilterGenre(genre: string) { - this.selectedGenre = genre; - }, setSelectedFilterGenres(genres: string[]) { this.selectedGenres = genres; }, setGenresLogic(logic: "any" | "all") { this.genresLogic = logic; }, - setSelectedFilterFranchise(franchise: string) { - this.selectedFranchise = franchise; - }, setSelectedFilterFranchises(franchises: string[]) { this.selectedFranchises = franchises; }, setFranchisesLogic(logic: "any" | "all") { this.franchisesLogic = logic; }, - setSelectedFilterCollection(collection: string) { - this.selectedCollection = collection; - }, setSelectedFilterCollections(collections: string[]) { this.selectedCollections = collections; }, setCollectionsLogic(logic: "any" | "all") { this.collectionsLogic = logic; }, - setSelectedFilterCompany(company: string) { - this.selectedCompany = company; - }, setSelectedFilterCompanies(companies: string[]) { this.selectedCompanies = companies; }, setCompaniesLogic(logic: "any" | "all") { this.companiesLogic = logic; }, - setSelectedFilterAgeRating(ageRating: string) { - this.selectedAgeRating = ageRating; - }, setSelectedFilterAgeRatings(ageRatings: string[]) { this.selectedAgeRatings = ageRatings; }, setAgeRatingsLogic(logic: "any" | "all") { this.ageRatingsLogic = logic; }, - setSelectedFilterRegion(region: string) { - this.selectedRegion = region; - }, setSelectedFilterRegions(regions: string[]) { this.selectedRegions = regions; }, setRegionsLogic(logic: "any" | "all") { this.regionsLogic = logic; }, - setSelectedFilterLanguage(language: string) { - this.selectedLanguage = language; - }, setSelectedFilterLanguages(languages: string[]) { this.selectedLanguages = languages; }, setLanguagesLogic(logic: "any" | "all") { this.languagesLogic = logic; }, - setSelectedFilterStatus(status: string) { - this.selectedStatus = status; - }, setSelectedFilterStatuses(statuses: string[]) { this.selectedStatuses = statuses; }, @@ -361,21 +329,13 @@ export default defineStore("galleryFilter", { this.filterVerified !== null || this.selectedPlatform || this.selectedPlatforms.length > 0 || - this.selectedGenre || this.selectedGenres.length > 0 || - this.selectedFranchise || this.selectedFranchises.length > 0 || - this.selectedCollection || this.selectedCollections.length > 0 || - this.selectedCompany || this.selectedCompanies.length > 0 || - this.selectedAgeRating || this.selectedAgeRatings.length > 0 || - this.selectedRegion || this.selectedRegions.length > 0 || - this.selectedLanguage || this.selectedLanguages.length > 0 || - this.selectedStatus || this.selectedStatuses.length > 0, ); }, @@ -385,21 +345,13 @@ export default defineStore("galleryFilter", { resetFilters() { this.selectedPlatform = null; this.selectedPlatforms = []; - this.selectedGenre = null; this.selectedGenres = []; - this.selectedFranchise = null; this.selectedFranchises = []; - this.selectedCollection = null; this.selectedCollections = []; - this.selectedCompany = null; this.selectedCompanies = []; - this.selectedAgeRating = null; this.selectedAgeRatings = []; - this.selectedRegion = null; this.selectedRegions = []; - this.selectedLanguage = null; this.selectedLanguages = []; - this.selectedStatus = null; this.selectedStatuses = []; this.filterMatched = null; this.filterFavorites = null; diff --git a/frontend/src/stores/roms.ts b/frontend/src/stores/roms.ts index 0ae1dd4b5..86176c836 100644 --- a/frontend/src/stores/roms.ts +++ b/frontend/src/stores/roms.ts @@ -153,6 +153,7 @@ export default defineStore("roms", { ageRatingsLogic: galleryFilter.ageRatingsLogic, regionsLogic: galleryFilter.regionsLogic, languagesLogic: galleryFilter.languagesLogic, + statusesLogic: galleryFilter.statusesLogic, }; return params; },