Future support for filtering tags list by current filter on Performers page (#6091)

This commit is contained in:
CJ 2026-02-04 20:35:58 -06:00 committed by GitHub
parent 9eda7c2f60
commit f629191b28
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 41 additions and 6 deletions

View file

@ -642,6 +642,8 @@ input TagFilterType {
images_filter: ImageFilterType
"Filter by related galleries that meet this criteria"
galleries_filter: GalleryFilterType
"Filter by related performers that meet this criteria"
performers_filter: PerformerFilterType
"Filter by creation time"
created_at: TimestampCriterionInput

View file

@ -50,6 +50,8 @@ type TagFilterType struct {
ImagesFilter *ImageFilterType `json:"images_filter"`
// Filter by related galleries that meet this criteria
GalleriesFilter *GalleryFilterType `json:"galleries_filter"`
// Filter by related performers that meet this criteria
PerformersFilter *PerformerFilterType `json:"performers_filter"`
// Filter by created at
CreatedAt *TimestampCriterionInput `json:"created_at"`
// Filter by updated at

View file

@ -104,9 +104,10 @@ type tagRepositoryType struct {
aliases stringRepository
stashIDs stashIDRepository
scenes joinRepository
images joinRepository
galleries joinRepository
scenes joinRepository
images joinRepository
galleries joinRepository
performers joinRepository
}
var (
@ -152,6 +153,14 @@ var (
fkColumn: galleryIDColumn,
foreignTable: galleryTable,
},
performers: joinRepository{
repository: repository{
tableName: performersTagsTable,
idColumn: tagIDColumn,
},
fkColumn: performerIDColumn,
foreignTable: performerTable,
},
}
)

View file

@ -127,6 +127,15 @@ func (qb *tagFilterHandler) criterionHandler() criterionHandler {
tagRepository.galleries.innerJoin(f, "", "tags.id")
},
},
&relatedFilterHandler{
relatedIDCol: "performers_tags.performer_id",
relatedRepo: performerRepository.repository,
relatedHandler: &performerFilterHandler{tagFilter.PerformersFilter},
joinFn: func(f *filterBuilder) {
tagRepository.performers.innerJoin(f, "", "tags.id")
},
},
}
}

View file

@ -21,6 +21,7 @@ import {
GalleryFilterType,
InputMaybe,
IntCriterionInput,
PerformerFilterType,
SceneFilterType,
} from "src/core/generated-graphql";
import { useIntl } from "react-intl";
@ -516,6 +517,8 @@ export function makeQueryVariables(query: string, extraProps: {}) {
interface IFilterType {
scenes_filter?: InputMaybe<SceneFilterType>;
scene_count?: InputMaybe<IntCriterionInput>;
performers_filter?: InputMaybe<PerformerFilterType>;
performer_count?: InputMaybe<IntCriterionInput>;
galleries_filter?: InputMaybe<GalleryFilterType>;
gallery_count?: InputMaybe<IntCriterionInput>;
}
@ -523,7 +526,7 @@ interface IFilterType {
export function setObjectFilter(
out: IFilterType,
mode: FilterMode,
relatedFilterOutput: SceneFilterType | GalleryFilterType
relatedFilterOutput: SceneFilterType | PerformerFilterType | GalleryFilterType
) {
const empty = Object.keys(relatedFilterOutput).length === 0;
@ -536,7 +539,17 @@ export function setObjectFilter(
value: 0,
};
}
out.scenes_filter = relatedFilterOutput;
out.scenes_filter = relatedFilterOutput as SceneFilterType;
break;
case FilterMode.Performers:
// if empty, only get objects with performers
if (empty) {
out.performer_count = {
modifier: CriterionModifier.GreaterThan,
value: 0,
};
}
out.performers_filter = relatedFilterOutput as PerformerFilterType;
break;
case FilterMode.Galleries:
// if empty, only get objects with galleries
@ -546,7 +559,7 @@ export function setObjectFilter(
value: 0,
};
}
out.galleries_filter = relatedFilterOutput;
out.galleries_filter = relatedFilterOutput as GalleryFilterType;
break;
default:
throw new Error("Invalid filter mode");