From 48d6df9cc02dfb74a6af4dd6b2e4efb6ae448024 Mon Sep 17 00:00:00 2001 From: zurdi Date: Wed, 24 Dec 2025 15:23:44 +0000 Subject: [PATCH] feat: add logic operators for multi-value filters in collections and roms handlers --- .../handler/database/collections_handler.py | 8 ++++ backend/handler/database/roms_handler.py | 8 ++++ .../Dialog/CreateSmartCollection.vue | 42 +++++++++++++++---- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/backend/handler/database/collections_handler.py b/backend/handler/database/collections_handler.py index 2852ca929..16fe2a66b 100644 --- a/backend/handler/database/collections_handler.py +++ b/backend/handler/database/collections_handler.py @@ -294,6 +294,14 @@ class DBCollectionsHandler(DBBaseHandler): selected_status=criteria.get("selected_status"), regions=regions, languages=languages, + # Logic operators for multi-value filters + genres_logic=criteria.get("genres_logic", "any"), + franchises_logic=criteria.get("franchises_logic", "any"), + collections_logic=criteria.get("collections_logic", "any"), + companies_logic=criteria.get("companies_logic", "any"), + age_ratings_logic=criteria.get("age_ratings_logic", "any"), + regions_logic=criteria.get("regions_logic", "any"), + languages_logic=criteria.get("languages_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 8d5a8f563..f274e914f 100644 --- a/backend/handler/database/roms_handler.py +++ b/backend/handler/database/roms_handler.py @@ -735,6 +735,14 @@ class DBRomsHandler(DBBaseHandler): selected_status=kwargs.get("selected_status", None), regions=kwargs.get("regions", None), languages=kwargs.get("languages", None), + # Logic operators for multi-value filters + genres_logic=kwargs.get("genres_logic", "any"), + franchises_logic=kwargs.get("franchises_logic", "any"), + collections_logic=kwargs.get("collections_logic", "any"), + companies_logic=kwargs.get("companies_logic", "any"), + age_ratings_logic=kwargs.get("age_ratings_logic", "any"), + regions_logic=kwargs.get("regions_logic", "any"), + languages_logic=kwargs.get("languages_logic", "any"), user_id=kwargs.get("user_id", None), ) return session.scalars(roms).all() diff --git a/frontend/src/components/common/Collection/Dialog/CreateSmartCollection.vue b/frontend/src/components/common/Collection/Dialog/CreateSmartCollection.vue index 3f8bd6f1c..d27663c8e 100644 --- a/frontend/src/components/common/Collection/Dialog/CreateSmartCollection.vue +++ b/frontend/src/components/common/Collection/Dialog/CreateSmartCollection.vue @@ -42,6 +42,13 @@ const { selectedPlatforms, selectedRegions, selectedLanguages, + genresLogic, + franchisesLogic, + collectionsLogic, + companiesLogic, + ageRatingsLogic, + regionsLogic, + languagesLogic, } = storeToRefs(galleryFilterStore); const emitter = inject>("emitter"); @@ -133,16 +140,31 @@ async function createSmartCollection() { if (filterRA.value) filterCriteria.has_ra = true; if (filterMissing.value) filterCriteria.missing = true; if (filterVerified.value) filterCriteria.verified = true; - if (selectedGenres.value && selectedGenres.value.length > 0) + if (selectedGenres.value && selectedGenres.value.length > 0) { filterCriteria.genres = selectedGenres.value; - if (selectedFranchises.value && selectedFranchises.value.length > 0) + if (selectedGenres.value.length > 1) + filterCriteria.genres_logic = genresLogic.value; + } + if (selectedFranchises.value && selectedFranchises.value.length > 0) { filterCriteria.franchises = selectedFranchises.value; - if (selectedCollections.value && selectedCollections.value.length > 0) + if (selectedFranchises.value.length > 1) + filterCriteria.franchises_logic = franchisesLogic.value; + } + if (selectedCollections.value && selectedCollections.value.length > 0) { filterCriteria.collections = selectedCollections.value; - if (selectedCompanies.value && selectedCompanies.value.length > 0) + if (selectedCollections.value.length > 1) + filterCriteria.collections_logic = collectionsLogic.value; + } + if (selectedCompanies.value && selectedCompanies.value.length > 0) { filterCriteria.companies = selectedCompanies.value; - if (selectedAgeRatings.value && selectedAgeRatings.value.length > 0) + if (selectedCompanies.value.length > 1) + filterCriteria.companies_logic = companiesLogic.value; + } + if (selectedAgeRatings.value && selectedAgeRatings.value.length > 0) { filterCriteria.age_ratings = selectedAgeRatings.value; + if (selectedAgeRatings.value.length > 1) + filterCriteria.age_ratings_logic = ageRatingsLogic.value; + } if (selectedStatuses.value && selectedStatuses.value.length > 0) { const statusKeys = selectedStatuses.value .filter((s): s is string => s !== null) @@ -152,10 +174,16 @@ async function createSmartCollection() { filterCriteria.selected_status = statusKeys; } } - if (selectedRegions.value && selectedRegions.value.length > 0) + if (selectedRegions.value && selectedRegions.value.length > 0) { filterCriteria.regions = selectedRegions.value; - if (selectedLanguages.value && selectedLanguages.value.length > 0) + if (selectedRegions.value.length > 1) + filterCriteria.regions_logic = regionsLogic.value; + } + if (selectedLanguages.value && selectedLanguages.value.length > 0) { filterCriteria.languages = selectedLanguages.value; + if (selectedLanguages.value.length > 1) + filterCriteria.languages_logic = languagesLogic.value; + } const { data } = await collectionApi.createSmartCollection({ smartCollection: {