mirror of
https://github.com/rommapp/romm.git
synced 2026-02-18 00:27:41 +01:00
feat: update ROM filtering to support multi-value statuses and logic operators
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 } : {}),
|
||||
|
||||
58
frontend/src/services/cache/api.ts
vendored
58
frontend/src/services/cache/api.ts
vendored
@@ -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 }
|
||||
: {}),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -153,6 +153,7 @@ export default defineStore("roms", {
|
||||
ageRatingsLogic: galleryFilter.ageRatingsLogic,
|
||||
regionsLogic: galleryFilter.regionsLogic,
|
||||
languagesLogic: galleryFilter.languagesLogic,
|
||||
statusesLogic: galleryFilter.statusesLogic,
|
||||
};
|
||||
return params;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user