This commit is contained in:
CJ 2025-12-02 13:06:48 -06:00 committed by GitHub
commit e6aa19156e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 53 additions and 5 deletions

View file

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

View file

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

View file

@ -107,6 +107,7 @@ type tagRepositoryType struct {
scenes joinRepository scenes joinRepository
images joinRepository images joinRepository
galleries joinRepository galleries joinRepository
performers joinRepository
} }
var ( var (
@ -152,6 +153,14 @@ var (
fkColumn: galleryIDColumn, fkColumn: galleryIDColumn,
foreignTable: galleryTable, foreignTable: galleryTable,
}, },
performers: joinRepository{
repository: repository{
tableName: performersTagsTable,
idColumn: tagIDColumn,
},
fkColumn: performerIDColumn,
foreignTable: performerTable,
},
} }
) )

View file

@ -113,6 +113,15 @@ func (qb *tagFilterHandler) criterionHandler() criterionHandler {
tagRepository.galleries.innerJoin(f, "", "tags.id") 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

@ -18,8 +18,10 @@ import { Option } from "./SidebarListFilter";
import { import {
CriterionModifier, CriterionModifier,
FilterMode, FilterMode,
GalleryFilterType,
InputMaybe, InputMaybe,
IntCriterionInput, IntCriterionInput,
PerformerFilterType,
SceneFilterType, SceneFilterType,
} from "src/core/generated-graphql"; } from "src/core/generated-graphql";
import { useIntl } from "react-intl"; import { useIntl } from "react-intl";
@ -515,12 +517,16 @@ export function makeQueryVariables(query: string, extraProps: {}) {
interface IFilterType { interface IFilterType {
scenes_filter?: InputMaybe<SceneFilterType>; scenes_filter?: InputMaybe<SceneFilterType>;
scene_count?: InputMaybe<IntCriterionInput>; scene_count?: InputMaybe<IntCriterionInput>;
performers_filter?: InputMaybe<PerformerFilterType>;
performer_count?: InputMaybe<IntCriterionInput>;
galleries_filter?: InputMaybe<GalleryFilterType>;
gallery_count?: InputMaybe<IntCriterionInput>;
} }
export function setObjectFilter( export function setObjectFilter(
out: IFilterType, out: IFilterType,
mode: FilterMode, mode: FilterMode,
relatedFilterOutput: SceneFilterType relatedFilterOutput: SceneFilterType | PerformerFilterType | GalleryFilterType
) { ) {
const empty = Object.keys(relatedFilterOutput).length === 0; const empty = Object.keys(relatedFilterOutput).length === 0;
@ -533,7 +539,27 @@ export function setObjectFilter(
value: 0, 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.gallery_count = {
modifier: CriterionModifier.GreaterThan,
value: 0,
};
}
out.galleries_filter = relatedFilterOutput as GalleryFilterType;
break; break;
} }
} }