From dc37a3045b2789d1f4e6dc8e9fd3b2ccc2bc7fcc Mon Sep 17 00:00:00 2001 From: Anon247 <61889302+Anon247@users.noreply.github.com> Date: Wed, 8 Apr 2020 05:21:05 +0100 Subject: [PATCH] Added various missing filters to performer page (#438) --- graphql/schema/types/filters.graphql | 2 + pkg/models/querybuilder_performer.go | 9 ++++ .../models/list-filter/criteria/criterion.ts | 7 ++- .../models/list-filter/criteria/is-missing.ts | 43 ++++++++++++++++--- .../src/models/list-filter/criteria/utils.ts | 9 ++-- ui/v2.5/src/models/list-filter/filter.ts | 16 +++---- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index 894f30e50a5..efc3552dce1 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -48,6 +48,8 @@ input PerformerFilterType { aliases: StringCriterionInput """Filter by gender""" gender: GenderCriterionInput + """Filter to only include performers missing this property""" + is_missing: String } input SceneMarkerFilterType { diff --git a/pkg/models/querybuilder_performer.go b/pkg/models/querybuilder_performer.go index 84991c16137..06fdc9b7e16 100644 --- a/pkg/models/querybuilder_performer.go +++ b/pkg/models/querybuilder_performer.go @@ -158,6 +158,15 @@ func (qb *PerformerQueryBuilder) Query(performerFilter *PerformerFilterType, fin query.addArg(gender.Value.String()) } + if isMissingFilter := performerFilter.IsMissing; isMissingFilter != nil && *isMissingFilter != "" { + switch *isMissingFilter { + case "scenes": + query.addWhere("scenes_join.scene_id IS NULL") + default: + query.addWhere("performers." + *isMissingFilter + " IS NULL") + } + } + handleStringCriterion(tableName+".ethnicity", performerFilter.Ethnicity, &query) handleStringCriterion(tableName+".country", performerFilter.Country, &query) handleStringCriterion(tableName+".eye_color", performerFilter.EyeColor, &query) diff --git a/ui/v2.5/src/models/list-filter/criteria/criterion.ts b/ui/v2.5/src/models/list-filter/criteria/criterion.ts index f1ab28bf7bf..8a142eff34f 100644 --- a/ui/v2.5/src/models/list-filter/criteria/criterion.ts +++ b/ui/v2.5/src/models/list-filter/criteria/criterion.ts @@ -12,7 +12,8 @@ export type CriterionType = | "duration" | "favorite" | "hasMarkers" - | "isMissing" + | "sceneIsMissing" + | "performerIsMissing" | "tags" | "sceneTags" | "performers" @@ -52,7 +53,9 @@ export abstract class Criterion { return "Favorite"; case "hasMarkers": return "Has Markers"; - case "isMissing": + case "sceneIsMissing": + return "Is Missing"; + case "performerIsMissing": return "Is Missing"; case "tags": return "Tags"; diff --git a/ui/v2.5/src/models/list-filter/criteria/is-missing.ts b/ui/v2.5/src/models/list-filter/criteria/is-missing.ts index c930ec66090..19aa2341009 100644 --- a/ui/v2.5/src/models/list-filter/criteria/is-missing.ts +++ b/ui/v2.5/src/models/list-filter/criteria/is-missing.ts @@ -1,11 +1,15 @@ import { CriterionModifier } from "src/core/generated-graphql"; import { Criterion, CriterionType, ICriterionOption } from "./criterion"; -export class IsMissingCriterion extends Criterion { - public type: CriterionType = "isMissing"; +export abstract class IsMissingCriterion extends Criterion { public parameterName: string = "is_missing"; - public modifier = CriterionModifier.Equals; public modifierOptions = []; + public modifier = CriterionModifier.Equals; + public value: string = ""; +} + +export class SceneIsMissingCriterion extends IsMissingCriterion { + public type: CriterionType = "sceneIsMissing"; public options: string[] = [ "title", "url", @@ -15,10 +19,35 @@ export class IsMissingCriterion extends Criterion { "movie", "performers", ]; - public value: string = ""; } -export class IsMissingCriterionOption implements ICriterionOption { - public label: string = Criterion.getLabel("isMissing"); - public value: CriterionType = "isMissing"; +export class SceneIsMissingCriterionOption implements ICriterionOption { + public label: string = Criterion.getLabel("sceneIsMissing"); + public value: CriterionType = "sceneIsMissing"; +} + +export class PerformerIsMissingCriterion extends IsMissingCriterion { + public type: CriterionType = "performerIsMissing"; + public options: string[] = [ + "url", + "twitter", + "instagram", + "ethnicity", + "country", + "eye_color", + "height", + "measurements", + "fake_tits", + "career_length", + "tattoos", + "piercings", + "aliases", + "gender", + "scenes" + ]; +} + +export class PerformerIsMissingCriterionOption implements ICriterionOption { + public label: string = Criterion.getLabel("performerIsMissing"); + public value: CriterionType = "performerIsMissing"; } diff --git a/ui/v2.5/src/models/list-filter/criteria/utils.ts b/ui/v2.5/src/models/list-filter/criteria/utils.ts index a236a448a26..9c94fe51644 100644 --- a/ui/v2.5/src/models/list-filter/criteria/utils.ts +++ b/ui/v2.5/src/models/list-filter/criteria/utils.ts @@ -9,7 +9,7 @@ import { } from "./criterion"; import { FavoriteCriterion } from "./favorite"; import { HasMarkersCriterion } from "./has-markers"; -import { IsMissingCriterion } from "./is-missing"; +import {PerformerIsMissingCriterion, SceneIsMissingCriterion} from "./is-missing"; import { NoneCriterion } from "./none"; import { PerformersCriterion } from "./performers"; import { RatingCriterion } from "./rating"; @@ -35,8 +35,10 @@ export function makeCriteria(type: CriterionType = "none") { return new FavoriteCriterion(); case "hasMarkers": return new HasMarkersCriterion(); - case "isMissing": - return new IsMissingCriterion(); + case "sceneIsMissing": + return new SceneIsMissingCriterion(); + case "performerIsMissing": + return new PerformerIsMissingCriterion(); case "tags": return new TagsCriterion("tags"); case "sceneTags": @@ -47,7 +49,6 @@ export function makeCriteria(type: CriterionType = "none") { return new StudiosCriterion(); case "movies": return new MoviesCriterion(); - case "birth_year": return new NumberCriterion(type, type); case "age": { diff --git a/ui/v2.5/src/models/list-filter/filter.ts b/ui/v2.5/src/models/list-filter/filter.ts index 5f28f68d776..8fee846c72c 100644 --- a/ui/v2.5/src/models/list-filter/filter.ts +++ b/ui/v2.5/src/models/list-filter/filter.ts @@ -27,7 +27,8 @@ import { } from "./criteria/has-markers"; import { IsMissingCriterion, - IsMissingCriterionOption, + PerformerIsMissingCriterionOption, + SceneIsMissingCriterionOption } from "./criteria/is-missing"; import { NoneCriterionOption } from "./criteria/none"; import { @@ -115,7 +116,7 @@ export class ListFilterModel { new ResolutionCriterionOption(), ListFilterModel.createCriterionOption("duration"), new HasMarkersCriterionOption(), - new IsMissingCriterionOption(), + new SceneIsMissingCriterionOption(), new TagsCriterionOption(), new PerformersCriterionOption(), new StudiosCriterionOption(), @@ -145,13 +146,10 @@ export class ListFilterModel { new NoneCriterionOption(), new FavoriteCriterionOption(), new GenderCriterionOption(), + new PerformerIsMissingCriterionOption(), + ...numberCriteria.concat(stringCriteria).map(c => ListFilterModel.createCriterionOption(c)) ]; - this.criterionOptions = this.criterionOptions.concat( - numberCriteria.concat(stringCriteria).map((c) => { - return ListFilterModel.createCriterionOption(c); - }) - ); break; } case FilterMode.Studios: @@ -381,7 +379,7 @@ export class ListFilterModel { case "hasMarkers": result.has_markers = (criterion as HasMarkersCriterion).value; break; - case "isMissing": + case "sceneIsMissing": result.is_missing = (criterion as IsMissingCriterion).value; break; case "tags": { @@ -513,6 +511,8 @@ export class ListFilterModel { }; break; } + case "performerIsMissing": + result.is_missing = (criterion as IsMissingCriterion).value; // no default } });