Fix rating and country filters (#4105)

* Fix country criterion
* Fixing rating criterion
This commit is contained in:
WithoutPants
2023-09-11 14:41:13 +10:00
committed by GitHub
parent 798db1a8ea
commit da38ec03c0
11 changed files with 99 additions and 38 deletions

View File

@@ -1,13 +1,24 @@
import { IntlShape } from "react-intl"; import { IntlShape } from "react-intl";
import { CriterionModifier } from "src/core/generated-graphql"; import { CriterionModifier } from "src/core/generated-graphql";
import { getCountryByISO } from "src/utils/country"; import { getCountryByISO } from "src/utils/country";
import { StringCriterion, StringCriterionOption } from "./criterion"; import {
CriterionOption,
StringCriterion,
StringCriterionOption,
} from "./criterion";
const countryCriterionOption = new StringCriterionOption("country", "country"); export const CountryCriterionOption = new CriterionOption({
messageID: "country",
type: "country",
modifierOptions: StringCriterionOption.modifierOptions,
defaultModifier: StringCriterionOption.defaultModifier,
makeCriterion: () => new CountryCriterion(),
inputType: StringCriterionOption.inputType,
});
export class CountryCriterion extends StringCriterion { export class CountryCriterion extends StringCriterion {
constructor() { constructor() {
super(countryCriterionOption); super(CountryCriterionOption);
} }
protected getLabelValue(intl: IntlShape) { protected getLabelValue(intl: IntlShape) {

View File

@@ -10,6 +10,7 @@ import {
PHashDuplicationCriterionInput, PHashDuplicationCriterionInput,
DateCriterionInput, DateCriterionInput,
TimestampCriterionInput, TimestampCriterionInput,
ConfigDataFragment,
} from "src/core/generated-graphql"; } from "src/core/generated-graphql";
import DurationUtils from "src/utils/duration"; import DurationUtils from "src/utils/duration";
import { import {
@@ -193,7 +194,10 @@ interface ICriterionOptionsParams {
modifierOptions?: CriterionModifier[]; modifierOptions?: CriterionModifier[];
defaultModifier?: CriterionModifier; defaultModifier?: CriterionModifier;
options?: Option[]; options?: Option[];
makeCriterion: () => Criterion<CriterionValue>; makeCriterion: (
o: CriterionOption,
config?: ConfigDataFragment
) => Criterion<CriterionValue>;
} }
export class CriterionOption { export class CriterionOption {
public readonly messageID: string; public readonly messageID: string;
@@ -203,7 +207,8 @@ export class CriterionOption {
public readonly options: Option[] | undefined; public readonly options: Option[] | undefined;
public readonly inputType: InputType; public readonly inputType: InputType;
public readonly makeCriterionFn: ( public readonly makeCriterionFn: (
o: CriterionOption o: CriterionOption,
config?: ConfigDataFragment
) => Criterion<CriterionValue>; ) => Criterion<CriterionValue>;
constructor(options: ICriterionOptionsParams) { constructor(options: ICriterionOptionsParams) {
@@ -216,17 +221,13 @@ export class CriterionOption {
this.makeCriterionFn = options.makeCriterion; this.makeCriterionFn = options.makeCriterion;
} }
public makeCriterion() { public makeCriterion(config?: ConfigDataFragment) {
return this.makeCriterionFn(this); return this.makeCriterionFn(this, config);
} }
} }
export class StringCriterionOption extends CriterionOption { export class StringCriterionOption extends CriterionOption {
constructor(messageID: string, type: CriterionType, options?: Option[]) { public static readonly modifierOptions = [
super({
messageID,
type,
modifierOptions: [
CriterionModifier.Equals, CriterionModifier.Equals,
CriterionModifier.NotEquals, CriterionModifier.NotEquals,
CriterionModifier.Includes, CriterionModifier.Includes,
@@ -235,10 +236,19 @@ export class StringCriterionOption extends CriterionOption {
CriterionModifier.NotNull, CriterionModifier.NotNull,
CriterionModifier.MatchesRegex, CriterionModifier.MatchesRegex,
CriterionModifier.NotMatchesRegex, CriterionModifier.NotMatchesRegex,
], ];
defaultModifier: CriterionModifier.Equals,
public static readonly defaultModifier = CriterionModifier.Equals;
public static readonly inputType = "text";
constructor(messageID: string, type: CriterionType, options?: Option[]) {
super({
messageID,
type,
modifierOptions: StringCriterionOption.modifierOptions,
defaultModifier: StringCriterionOption.defaultModifier,
options, options,
inputType: "text", inputType: StringCriterionOption.inputType,
makeCriterion: () => new StringCriterion(this), makeCriterion: () => new StringCriterion(this),
}); });
} }

View File

@@ -22,7 +22,8 @@ const filterModeOptions = {
export function makeCriteria( export function makeCriteria(
mode: GQL.FilterMode, mode: GQL.FilterMode,
type: CriterionType = "none" type: CriterionType,
config?: GQL.ConfigDataFragment
) { ) {
const criterionOptions = filterModeOptions[mode]; const criterionOptions = filterModeOptions[mode];
@@ -32,5 +33,5 @@ export function makeCriteria(
throw new Error(`Unknown criterion parameter name: ${type}`); throw new Error(`Unknown criterion parameter name: ${type}`);
} }
return option?.makeCriterion(); return option?.makeCriterion(config);
} }

View File

@@ -1,14 +1,44 @@
import { import {
convertFromRatingFormat, convertFromRatingFormat,
convertToRatingFormat, convertToRatingFormat,
defaultRatingSystemOptions,
RatingSystemOptions, RatingSystemOptions,
} from "src/utils/rating"; } from "src/utils/rating";
import { import {
ConfigDataFragment,
CriterionModifier, CriterionModifier,
IntCriterionInput, IntCriterionInput,
} from "../../../core/generated-graphql"; } from "../../../core/generated-graphql";
import { INumberValue } from "../types"; import { INumberValue } from "../types";
import { Criterion, CriterionOption } from "./criterion"; import { Criterion, CriterionOption } from "./criterion";
import { IUIConfig } from "src/core/config";
const modifierOptions = [
CriterionModifier.Equals,
CriterionModifier.NotEquals,
CriterionModifier.GreaterThan,
CriterionModifier.LessThan,
CriterionModifier.Between,
CriterionModifier.NotBetween,
CriterionModifier.IsNull,
CriterionModifier.NotNull,
];
function getRatingSystemOptions(config?: ConfigDataFragment) {
return (
(config?.ui as IUIConfig)?.ratingSystemOptions ?? defaultRatingSystemOptions
);
}
export const RatingCriterionOption = new CriterionOption({
messageID: "rating",
type: "rating100",
modifierOptions,
defaultModifier: CriterionModifier.Equals,
makeCriterion: (o, config) =>
new RatingCriterion(getRatingSystemOptions(config)),
inputType: "number",
});
export class RatingCriterion extends Criterion<INumberValue> { export class RatingCriterion extends Criterion<INumberValue> {
ratingSystem: RatingSystemOptions; ratingSystem: RatingSystemOptions;
@@ -50,8 +80,8 @@ export class RatingCriterion extends Criterion<INumberValue> {
} }
} }
constructor(type: CriterionOption, ratingSystem: RatingSystemOptions) { constructor(ratingSystem: RatingSystemOptions) {
super(type, { value: 0, value2: undefined }); super(RatingCriterionOption, { value: 0, value2: undefined });
this.ratingSystem = ratingSystem; this.ratingSystem = ratingSystem;
} }
} }

View File

@@ -128,7 +128,11 @@ export class ListFilterModel {
for (const jsonString of params.c) { for (const jsonString of params.c) {
try { try {
const encodedCriterion = JSON.parse(jsonString); const encodedCriterion = JSON.parse(jsonString);
const criterion = makeCriteria(this.mode, encodedCriterion.type); const criterion = makeCriteria(
this.mode,
encodedCriterion.type,
this.config
);
// it's possible that we have unsupported criteria. Just skip if so. // it's possible that we have unsupported criteria. Just skip if so.
if (criterion) { if (criterion) {
criterion.setFromEncodedCriterion(encodedCriterion); criterion.setFromEncodedCriterion(encodedCriterion);
@@ -276,7 +280,11 @@ export class ListFilterModel {
this.criteria = []; this.criteria = [];
if (objectFilter) { if (objectFilter) {
Object.keys(objectFilter).forEach((key) => { Object.keys(objectFilter).forEach((key) => {
const criterion = makeCriteria(this.mode, key as CriterionType); const criterion = makeCriteria(
this.mode,
key as CriterionType,
this.config
);
// it's possible that we have unsupported criteria. Just skip if so. // it's possible that we have unsupported criteria. Just skip if so.
if (criterion) { if (criterion) {
criterion.setFromEncodedCriterion(objectFilter[key]); criterion.setFromEncodedCriterion(objectFilter[key]);

View File

@@ -1,7 +1,6 @@
import { import {
createMandatoryNumberCriterionOption, createMandatoryNumberCriterionOption,
createStringCriterionOption, createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption, createDateCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
createPathCriterionOption, createPathCriterionOption,
@@ -19,6 +18,7 @@ import {
} from "./criteria/tags"; } from "./criteria/tags";
import { ListFilterOptions, MediaSortByOptions } from "./filter-options"; import { ListFilterOptions, MediaSortByOptions } from "./filter-options";
import { DisplayMode } from "./types"; import { DisplayMode } from "./types";
import { RatingCriterionOption } from "./criteria/rating";
const defaultSortBy = "path"; const defaultSortBy = "path";
@@ -46,7 +46,7 @@ const criterionOptions = [
createStringCriterionOption("details"), createStringCriterionOption("details"),
createPathCriterionOption("path"), createPathCriterionOption("path"),
createStringCriterionOption("checksum", "media_info.checksum"), createStringCriterionOption("checksum", "media_info.checksum"),
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
OrganizedCriterionOption, OrganizedCriterionOption,
AverageResolutionCriterionOption, AverageResolutionCriterionOption,
GalleryIsMissingCriterionOption, GalleryIsMissingCriterionOption,

View File

@@ -2,7 +2,6 @@ import {
createMandatoryNumberCriterionOption, createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption, createMandatoryStringCriterionOption,
createStringCriterionOption, createStringCriterionOption,
NullNumberCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
createDateCriterionOption, createDateCriterionOption,
createPathCriterionOption, createPathCriterionOption,
@@ -11,6 +10,7 @@ import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { ImageIsMissingCriterionOption } from "./criteria/is-missing"; import { ImageIsMissingCriterionOption } from "./criteria/is-missing";
import { OrganizedCriterionOption } from "./criteria/organized"; import { OrganizedCriterionOption } from "./criteria/organized";
import { PerformersCriterionOption } from "./criteria/performers"; import { PerformersCriterionOption } from "./criteria/performers";
import { RatingCriterionOption } from "./criteria/rating";
import { ResolutionCriterionOption } from "./criteria/resolution"; import { ResolutionCriterionOption } from "./criteria/resolution";
import { StudiosCriterionOption } from "./criteria/studios"; import { StudiosCriterionOption } from "./criteria/studios";
import { import {
@@ -40,7 +40,7 @@ const criterionOptions = [
ResolutionCriterionOption, ResolutionCriterionOption,
ImageIsMissingCriterionOption, ImageIsMissingCriterionOption,
TagsCriterionOption, TagsCriterionOption,
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
createMandatoryNumberCriterionOption("tag_count"), createMandatoryNumberCriterionOption("tag_count"),
PerformerTagsCriterionOption, PerformerTagsCriterionOption,
PerformersCriterionOption, PerformersCriterionOption,

View File

@@ -1,7 +1,6 @@
import { import {
createMandatoryNumberCriterionOption, createMandatoryNumberCriterionOption,
createStringCriterionOption, createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption, createDateCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
} from "./criteria/criterion"; } from "./criteria/criterion";
@@ -10,6 +9,7 @@ import { StudiosCriterionOption } from "./criteria/studios";
import { PerformersCriterionOption } from "./criteria/performers"; import { PerformersCriterionOption } from "./criteria/performers";
import { ListFilterOptions } from "./filter-options"; import { ListFilterOptions } from "./filter-options";
import { DisplayMode } from "./types"; import { DisplayMode } from "./types";
import { RatingCriterionOption } from "./criteria/rating";
const defaultSortBy = "name"; const defaultSortBy = "name";
@@ -30,7 +30,7 @@ const criterionOptions = [
createStringCriterionOption("director"), createStringCriterionOption("director"),
createStringCriterionOption("synopsis"), createStringCriterionOption("synopsis"),
createMandatoryNumberCriterionOption("duration"), createMandatoryNumberCriterionOption("duration"),
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
PerformersCriterionOption, PerformersCriterionOption,
createDateCriterionOption("date"), createDateCriterionOption("date"),
createMandatoryTimestampCriterionOption("created_at"), createMandatoryTimestampCriterionOption("created_at"),

View File

@@ -6,7 +6,6 @@ import {
createDateCriterionOption, createDateCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
NumberCriterionOption, NumberCriterionOption,
NullNumberCriterionOption,
} from "./criteria/criterion"; } from "./criteria/criterion";
import { FavoriteCriterionOption } from "./criteria/favorite"; import { FavoriteCriterionOption } from "./criteria/favorite";
import { GenderCriterionOption } from "./criteria/gender"; import { GenderCriterionOption } from "./criteria/gender";
@@ -17,6 +16,8 @@ import { StudiosCriterionOption } from "./criteria/studios";
import { TagsCriterionOption } from "./criteria/tags"; import { TagsCriterionOption } from "./criteria/tags";
import { ListFilterOptions } from "./filter-options"; import { ListFilterOptions } from "./filter-options";
import { CriterionType, DisplayMode } from "./types"; import { CriterionType, DisplayMode } from "./types";
import { CountryCriterionOption } from "./criteria/country";
import { RatingCriterionOption } from "./criteria/rating";
const defaultSortBy = "name"; const defaultSortBy = "name";
const sortByOptions = [ const sortByOptions = [
@@ -67,7 +68,6 @@ const stringCriteria: CriterionType[] = [
"disambiguation", "disambiguation",
"details", "details",
"ethnicity", "ethnicity",
"country",
"hair_color", "hair_color",
"eye_color", "eye_color",
"measurements", "measurements",
@@ -87,7 +87,7 @@ const criterionOptions = [
StudiosCriterionOption, StudiosCriterionOption,
StashIDCriterionOption, StashIDCriterionOption,
createStringCriterionOption("url"), createStringCriterionOption("url"),
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
createMandatoryNumberCriterionOption("tag_count"), createMandatoryNumberCriterionOption("tag_count"),
createMandatoryNumberCriterionOption("scene_count"), createMandatoryNumberCriterionOption("scene_count"),
createMandatoryNumberCriterionOption("image_count"), createMandatoryNumberCriterionOption("image_count"),
@@ -96,6 +96,7 @@ const criterionOptions = [
createBooleanCriterionOption("ignore_auto_tag"), createBooleanCriterionOption("ignore_auto_tag"),
new NumberCriterionOption("height", "height_cm"), new NumberCriterionOption("height", "height_cm"),
...numberCriteria.map((c) => createNumberCriterionOption(c)), ...numberCriteria.map((c) => createNumberCriterionOption(c)),
CountryCriterionOption,
...stringCriteria.map((c) => createStringCriterionOption(c)), ...stringCriteria.map((c) => createStringCriterionOption(c)),
createDateCriterionOption("birthdate"), createDateCriterionOption("birthdate"),
createDateCriterionOption("death_date"), createDateCriterionOption("death_date"),

View File

@@ -2,7 +2,6 @@ import {
createMandatoryNumberCriterionOption, createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption, createMandatoryStringCriterionOption,
createStringCriterionOption, createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption, createDateCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
createPathCriterionOption, createPathCriterionOption,
@@ -28,6 +27,7 @@ import {
import { PerformerFavoriteCriterionOption } from "./criteria/favorite"; import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { CaptionsCriterionOption } from "./criteria/captions"; import { CaptionsCriterionOption } from "./criteria/captions";
import { StashIDCriterionOption } from "./criteria/stash-ids"; import { StashIDCriterionOption } from "./criteria/stash-ids";
import { RatingCriterionOption } from "./criteria/rating";
const defaultSortBy = "date"; const defaultSortBy = "date";
const sortByOptions = [ const sortByOptions = [
@@ -68,7 +68,7 @@ const criterionOptions = [
PhashCriterionOption, PhashCriterionOption,
DuplicatedCriterionOption, DuplicatedCriterionOption,
OrganizedCriterionOption, OrganizedCriterionOption,
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
createMandatoryNumberCriterionOption("o_counter"), createMandatoryNumberCriterionOption("o_counter"),
ResolutionCriterionOption, ResolutionCriterionOption,
createStringCriterionOption("video_codec"), createStringCriterionOption("video_codec"),

View File

@@ -3,10 +3,10 @@ import {
createMandatoryNumberCriterionOption, createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption, createMandatoryStringCriterionOption,
createStringCriterionOption, createStringCriterionOption,
NullNumberCriterionOption,
createMandatoryTimestampCriterionOption, createMandatoryTimestampCriterionOption,
} from "./criteria/criterion"; } from "./criteria/criterion";
import { StudioIsMissingCriterionOption } from "./criteria/is-missing"; import { StudioIsMissingCriterionOption } from "./criteria/is-missing";
import { RatingCriterionOption } from "./criteria/rating";
import { StashIDCriterionOption } from "./criteria/stash-ids"; import { StashIDCriterionOption } from "./criteria/stash-ids";
import { ParentStudiosCriterionOption } from "./criteria/studios"; import { ParentStudiosCriterionOption } from "./criteria/studios";
import { ListFilterOptions } from "./filter-options"; import { ListFilterOptions } from "./filter-options";
@@ -36,7 +36,7 @@ const criterionOptions = [
createStringCriterionOption("details"), createStringCriterionOption("details"),
ParentStudiosCriterionOption, ParentStudiosCriterionOption,
StudioIsMissingCriterionOption, StudioIsMissingCriterionOption,
new NullNumberCriterionOption("rating", "rating100"), RatingCriterionOption,
createBooleanCriterionOption("ignore_auto_tag"), createBooleanCriterionOption("ignore_auto_tag"),
createMandatoryNumberCriterionOption("scene_count"), createMandatoryNumberCriterionOption("scene_count"),
createMandatoryNumberCriterionOption("image_count"), createMandatoryNumberCriterionOption("image_count"),