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>
This commit is contained in:
OFP
2024-01-15 22:47:33 -05:00
committed by GitHub
parent 45e2e12594
commit 75099b38a8
5 changed files with 47 additions and 7 deletions

View File

@@ -562,6 +562,7 @@ input MultiCriterionInput {
input GenderCriterionInput {
value: GenderEnum
value_list: [GenderEnum!]
modifier: CriterionModifier!
}

View File

@@ -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

View File

@@ -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)
}
}))

View File

@@ -15,6 +15,7 @@ export const CircumcisedCriterionOption = new CriterionOption({
CriterionModifier.IsNull,
CriterionModifier.NotNull,
],
defaultModifier: CriterionModifier.Includes,
options: circumcisedStrings,
makeCriterion: () => new CircumcisedCriterion(),
});

View File

@@ -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<string[]>
) {
// 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);
}
}