From 75099b38a81624981f2999c7e3ed057778792086 Mon Sep 17 00:00:00 2001 From: OFP <134338272+ofpcode@users.noreply.github.com> Date: Mon, 15 Jan 2024 22:47:33 -0500 Subject: [PATCH] Update Performer gender filter (#4419) * Update Performer gender filter Updated the Performer gender filter to allow selection of multiple genders (`IS`) or performers with no gender specified (`IS NULL`). * Add default modifier for circumcised * Handle existing saved filters --------- Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com> --- graphql/schema/types/filters.graphql | 1 + pkg/models/performer.go | 5 ++- pkg/sqlite/performer.go | 8 +++- .../list-filter/criteria/circumcised.ts | 1 + .../src/models/list-filter/criteria/gender.ts | 39 +++++++++++++++++-- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index a52c4a6e6..8bcbfb4cc 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -562,6 +562,7 @@ input MultiCriterionInput { input GenderCriterionInput { value: GenderEnum + value_list: [GenderEnum!] modifier: CriterionModifier! } diff --git a/pkg/models/performer.go b/pkg/models/performer.go index f2bab92fd..9449d611d 100644 --- a/pkg/models/performer.go +++ b/pkg/models/performer.go @@ -56,8 +56,9 @@ func (e GenderEnum) MarshalGQL(w io.Writer) { } type GenderCriterionInput struct { - Value *GenderEnum `json:"value"` - Modifier CriterionModifier `json:"modifier"` + Value GenderEnum `json:"value"` + ValueList []GenderEnum `json:"value_list"` + Modifier CriterionModifier `json:"modifier"` } type CircumisedEnum string diff --git a/pkg/sqlite/performer.go b/pkg/sqlite/performer.go index a63529420..08192b0c5 100644 --- a/pkg/sqlite/performer.go +++ b/pkg/sqlite/performer.go @@ -600,7 +600,13 @@ func (qb *PerformerStore) makeFilter(ctx context.Context, filter *models.Perform query.handleCriterion(ctx, criterionHandlerFunc(func(ctx context.Context, f *filterBuilder) { if gender := filter.Gender; gender != nil { - f.addWhere(tableName+".gender = ?", gender.Value.String()) + genderCopy := *gender + if genderCopy.Value.IsValid() && len(genderCopy.ValueList) == 0 { + genderCopy.ValueList = []models.GenderEnum{genderCopy.Value} + } + + v := utils.StringerSliceToStringSlice(genderCopy.ValueList) + enumCriterionHandler(genderCopy.Modifier, v, tableName+".gender")(ctx, f) } })) diff --git a/ui/v2.5/src/models/list-filter/criteria/circumcised.ts b/ui/v2.5/src/models/list-filter/criteria/circumcised.ts index bff2c6052..5a1f0e7ad 100644 --- a/ui/v2.5/src/models/list-filter/criteria/circumcised.ts +++ b/ui/v2.5/src/models/list-filter/criteria/circumcised.ts @@ -15,6 +15,7 @@ export const CircumcisedCriterionOption = new CriterionOption({ CriterionModifier.IsNull, CriterionModifier.NotNull, ], + defaultModifier: CriterionModifier.Includes, options: circumcisedStrings, makeCriterion: () => new CircumcisedCriterion(), }); diff --git a/ui/v2.5/src/models/list-filter/criteria/gender.ts b/ui/v2.5/src/models/list-filter/criteria/gender.ts index 801e92259..3d7d50b1f 100644 --- a/ui/v2.5/src/models/list-filter/criteria/gender.ts +++ b/ui/v2.5/src/models/list-filter/criteria/gender.ts @@ -1,23 +1,54 @@ -import { GenderCriterionInput } from "src/core/generated-graphql"; +import { + CriterionModifier, + GenderCriterionInput, + GenderEnum, +} from "src/core/generated-graphql"; import { genderStrings, stringToGender } from "src/utils/gender"; -import { CriterionOption, StringCriterion } from "./criterion"; +import { + CriterionOption, + IEncodedCriterion, + MultiStringCriterion, +} from "./criterion"; export const GenderCriterionOption = new CriterionOption({ messageID: "gender", type: "gender", options: genderStrings, + modifierOptions: [ + CriterionModifier.Includes, + CriterionModifier.Excludes, + CriterionModifier.IsNull, + CriterionModifier.NotNull, + ], + defaultModifier: CriterionModifier.Includes, makeCriterion: () => new GenderCriterion(), }); -export class GenderCriterion extends StringCriterion { +export class GenderCriterion extends MultiStringCriterion { constructor() { super(GenderCriterionOption); } protected toCriterionInput(): GenderCriterionInput { + const value = this.value.map((v) => stringToGender(v)) as GenderEnum[]; + return { - value: stringToGender(this.value), + value_list: value, modifier: this.modifier, }; } + + public setFromEncodedCriterion( + encodedCriterion: IEncodedCriterion + ) { + // backwards compatibility - if the value is a string, convert it to an array + if (typeof encodedCriterion.value === "string") { + encodedCriterion = { + ...encodedCriterion, + value: [encodedCriterion.value], + }; + } + + super.setFromEncodedCriterion(encodedCriterion); + } }