From 17b5d010eecb34adbd88022552d2016bc2709ae6 Mon Sep 17 00:00:00 2001 From: CJ Date: Mon, 15 Sep 2025 23:45:05 -0500 Subject: [PATCH 1/2] Future support for filtering tags list by current filter on Performers page --- graphql/schema/types/filters.graphql | 2 ++ pkg/models/tag.go | 2 ++ pkg/sqlite/tag.go | 15 ++++++++-- pkg/sqlite/tag_filter.go | 9 ++++++ .../List/Filters/LabeledIdFilter.tsx | 30 +++++++++++++++++-- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index 23ec4ca48..e68813fd2 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -604,6 +604,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 diff --git a/pkg/models/tag.go b/pkg/models/tag.go index 1971a8bb6..d53863b37 100644 --- a/pkg/models/tag.go +++ b/pkg/models/tag.go @@ -46,6 +46,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 diff --git a/pkg/sqlite/tag.go b/pkg/sqlite/tag.go index 08337616e..868e5f92f 100644 --- a/pkg/sqlite/tag.go +++ b/pkg/sqlite/tag.go @@ -103,9 +103,10 @@ type tagRepositoryType struct { aliases stringRepository - scenes joinRepository - images joinRepository - galleries joinRepository + scenes joinRepository + images joinRepository + galleries joinRepository + performers joinRepository } var ( @@ -145,6 +146,14 @@ var ( fkColumn: galleryIDColumn, foreignTable: galleryTable, }, + performers: joinRepository{ + repository: repository{ + tableName: performersTagsTable, + idColumn: tagIDColumn, + }, + fkColumn: performerIDColumn, + foreignTable: performerTable, + }, } ) diff --git a/pkg/sqlite/tag_filter.go b/pkg/sqlite/tag_filter.go index 27afd5858..f55834f7e 100644 --- a/pkg/sqlite/tag_filter.go +++ b/pkg/sqlite/tag_filter.go @@ -113,6 +113,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") + }, + }, } } diff --git a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx index 200c16917..a982ea8ad 100644 --- a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx @@ -18,8 +18,10 @@ import { Option } from "./SidebarListFilter"; import { CriterionModifier, FilterMode, + GalleryFilterType, InputMaybe, IntCriterionInput, + PerformerFilterType, SceneFilterType, } from "src/core/generated-graphql"; import { useIntl } from "react-intl"; @@ -515,12 +517,16 @@ export function makeQueryVariables(query: string, extraProps: {}) { interface IFilterType { scenes_filter?: InputMaybe; scene_count?: InputMaybe; + performers_filter?: InputMaybe; + performer_count?: InputMaybe; + galleries_filter?: InputMaybe; + galleries_count?: InputMaybe; } export function setObjectFilter( out: IFilterType, mode: FilterMode, - relatedFilterOutput: SceneFilterType + relatedFilterOutput: SceneFilterType | PerformerFilterType | GalleryFilterType ) { const empty = Object.keys(relatedFilterOutput).length === 0; @@ -533,7 +539,27 @@ 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 performers + if (empty) { + out.galleries_count = { + modifier: CriterionModifier.GreaterThan, + value: 0, + }; + } + out.galleries_filter = relatedFilterOutput as GalleryFilterType; break; } } From a3f2d1436e8078dff8ca758d2d17103f494a129a Mon Sep 17 00:00:00 2001 From: CJ <72030708+cj12312021@users.noreply.github.com> Date: Tue, 16 Sep 2025 19:11:17 -0500 Subject: [PATCH 2/2] fix typo with gallery_count --- ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx index a982ea8ad..1bca96d84 100644 --- a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx @@ -520,7 +520,7 @@ interface IFilterType { performers_filter?: InputMaybe; performer_count?: InputMaybe; galleries_filter?: InputMaybe; - galleries_count?: InputMaybe; + gallery_count?: InputMaybe; } export function setObjectFilter( @@ -554,7 +554,7 @@ export function setObjectFilter( case FilterMode.Galleries: // if empty, only get objects with performers if (empty) { - out.galleries_count = { + out.gallery_count = { modifier: CriterionModifier.GreaterThan, value: 0, };