feat: update ROM filtering to support multi-value statuses and logic operators

This commit is contained in:
zurdi
2025-12-25 11:52:00 +00:00
parent 48d6df9cc0
commit a956008259
8 changed files with 125 additions and 202 deletions

View File

@@ -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,
)

View File

@@ -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"),

View File

@@ -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()

View File

@@ -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)

View File

@@ -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 } : {}),

View File

@@ -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 }
: {}),

View File

@@ -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;

View File

@@ -153,6 +153,7 @@ export default defineStore("roms", {
ageRatingsLogic: galleryFilter.ageRatingsLogic,
regionsLogic: galleryFilter.regionsLogic,
languagesLogic: galleryFilter.languagesLogic,
statusesLogic: galleryFilter.statusesLogic,
};
return params;
},