mirror of
https://github.com/stashapp/stash.git
synced 2025-12-16 20:07:05 +03:00
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:
@@ -562,6 +562,7 @@ input MultiCriterionInput {
|
||||
|
||||
input GenderCriterionInput {
|
||||
value: GenderEnum
|
||||
value_list: [GenderEnum!]
|
||||
modifier: CriterionModifier!
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}))
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ export const CircumcisedCriterionOption = new CriterionOption({
|
||||
CriterionModifier.IsNull,
|
||||
CriterionModifier.NotNull,
|
||||
],
|
||||
defaultModifier: CriterionModifier.Includes,
|
||||
options: circumcisedStrings,
|
||||
makeCriterion: () => new CircumcisedCriterion(),
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user