Skip to content

Commit

Permalink
Fix rating and country filters (stashapp#4105)
Browse files Browse the repository at this point in the history
* Fix country criterion
* Fixing rating criterion
  • Loading branch information
WithoutPants authored Sep 11, 2023
1 parent 798db1a commit da38ec0
Show file tree
Hide file tree
Showing 11 changed files with 99 additions and 38 deletions.
17 changes: 14 additions & 3 deletions ui/v2.5/src/models/list-filter/criteria/country.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
import { IntlShape } from "react-intl";
import { CriterionModifier } from "src/core/generated-graphql";
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 {
constructor() {
super(countryCriterionOption);
super(CountryCriterionOption);
}

protected getLabelValue(intl: IntlShape) {
Expand Down
42 changes: 26 additions & 16 deletions ui/v2.5/src/models/list-filter/criteria/criterion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
PHashDuplicationCriterionInput,
DateCriterionInput,
TimestampCriterionInput,
ConfigDataFragment,
} from "src/core/generated-graphql";
import DurationUtils from "src/utils/duration";
import {
Expand Down Expand Up @@ -193,7 +194,10 @@ interface ICriterionOptionsParams {
modifierOptions?: CriterionModifier[];
defaultModifier?: CriterionModifier;
options?: Option[];
makeCriterion: () => Criterion<CriterionValue>;
makeCriterion: (
o: CriterionOption,
config?: ConfigDataFragment
) => Criterion<CriterionValue>;
}
export class CriterionOption {
public readonly messageID: string;
Expand All @@ -203,7 +207,8 @@ export class CriterionOption {
public readonly options: Option[] | undefined;
public readonly inputType: InputType;
public readonly makeCriterionFn: (
o: CriterionOption
o: CriterionOption,
config?: ConfigDataFragment
) => Criterion<CriterionValue>;

constructor(options: ICriterionOptionsParams) {
Expand All @@ -216,29 +221,34 @@ export class CriterionOption {
this.makeCriterionFn = options.makeCriterion;
}

public makeCriterion() {
return this.makeCriterionFn(this);
public makeCriterion(config?: ConfigDataFragment) {
return this.makeCriterionFn(this, config);
}
}

export class StringCriterionOption extends CriterionOption {
public static readonly modifierOptions = [
CriterionModifier.Equals,
CriterionModifier.NotEquals,
CriterionModifier.Includes,
CriterionModifier.Excludes,
CriterionModifier.IsNull,
CriterionModifier.NotNull,
CriterionModifier.MatchesRegex,
CriterionModifier.NotMatchesRegex,
];

public static readonly defaultModifier = CriterionModifier.Equals;
public static readonly inputType = "text";

constructor(messageID: string, type: CriterionType, options?: Option[]) {
super({
messageID,
type,
modifierOptions: [
CriterionModifier.Equals,
CriterionModifier.NotEquals,
CriterionModifier.Includes,
CriterionModifier.Excludes,
CriterionModifier.IsNull,
CriterionModifier.NotNull,
CriterionModifier.MatchesRegex,
CriterionModifier.NotMatchesRegex,
],
defaultModifier: CriterionModifier.Equals,
modifierOptions: StringCriterionOption.modifierOptions,
defaultModifier: StringCriterionOption.defaultModifier,
options,
inputType: "text",
inputType: StringCriterionOption.inputType,
makeCriterion: () => new StringCriterion(this),
});
}
Expand Down
5 changes: 3 additions & 2 deletions ui/v2.5/src/models/list-filter/criteria/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const filterModeOptions = {

export function makeCriteria(
mode: GQL.FilterMode,
type: CriterionType = "none"
type: CriterionType,
config?: GQL.ConfigDataFragment
) {
const criterionOptions = filterModeOptions[mode];

Expand All @@ -32,5 +33,5 @@ export function makeCriteria(
throw new Error(`Unknown criterion parameter name: ${type}`);
}

return option?.makeCriterion();
return option?.makeCriterion(config);
}
34 changes: 32 additions & 2 deletions ui/v2.5/src/models/list-filter/criteria/rating.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,44 @@
import {
convertFromRatingFormat,
convertToRatingFormat,
defaultRatingSystemOptions,
RatingSystemOptions,
} from "src/utils/rating";
import {
ConfigDataFragment,
CriterionModifier,
IntCriterionInput,
} from "../../../core/generated-graphql";
import { INumberValue } from "../types";
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> {
ratingSystem: RatingSystemOptions;
Expand Down Expand Up @@ -50,8 +80,8 @@ export class RatingCriterion extends Criterion<INumberValue> {
}
}

constructor(type: CriterionOption, ratingSystem: RatingSystemOptions) {
super(type, { value: 0, value2: undefined });
constructor(ratingSystem: RatingSystemOptions) {
super(RatingCriterionOption, { value: 0, value2: undefined });
this.ratingSystem = ratingSystem;
}
}
12 changes: 10 additions & 2 deletions ui/v2.5/src/models/list-filter/filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,11 @@ export class ListFilterModel {
for (const jsonString of params.c) {
try {
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.
if (criterion) {
criterion.setFromEncodedCriterion(encodedCriterion);
Expand Down Expand Up @@ -276,7 +280,11 @@ export class ListFilterModel {
this.criteria = [];
if (objectFilter) {
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.
if (criterion) {
criterion.setFromEncodedCriterion(objectFilter[key]);
Expand Down
4 changes: 2 additions & 2 deletions ui/v2.5/src/models/list-filter/galleries.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import {
createMandatoryNumberCriterionOption,
createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption,
createMandatoryTimestampCriterionOption,
createPathCriterionOption,
Expand All @@ -19,6 +18,7 @@ import {
} from "./criteria/tags";
import { ListFilterOptions, MediaSortByOptions } from "./filter-options";
import { DisplayMode } from "./types";
import { RatingCriterionOption } from "./criteria/rating";

const defaultSortBy = "path";

Expand Down Expand Up @@ -46,7 +46,7 @@ const criterionOptions = [
createStringCriterionOption("details"),
createPathCriterionOption("path"),
createStringCriterionOption("checksum", "media_info.checksum"),
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
OrganizedCriterionOption,
AverageResolutionCriterionOption,
GalleryIsMissingCriterionOption,
Expand Down
4 changes: 2 additions & 2 deletions ui/v2.5/src/models/list-filter/images.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {
createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption,
createStringCriterionOption,
NullNumberCriterionOption,
createMandatoryTimestampCriterionOption,
createDateCriterionOption,
createPathCriterionOption,
Expand All @@ -11,6 +10,7 @@ import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { ImageIsMissingCriterionOption } from "./criteria/is-missing";
import { OrganizedCriterionOption } from "./criteria/organized";
import { PerformersCriterionOption } from "./criteria/performers";
import { RatingCriterionOption } from "./criteria/rating";
import { ResolutionCriterionOption } from "./criteria/resolution";
import { StudiosCriterionOption } from "./criteria/studios";
import {
Expand Down Expand Up @@ -40,7 +40,7 @@ const criterionOptions = [
ResolutionCriterionOption,
ImageIsMissingCriterionOption,
TagsCriterionOption,
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
createMandatoryNumberCriterionOption("tag_count"),
PerformerTagsCriterionOption,
PerformersCriterionOption,
Expand Down
4 changes: 2 additions & 2 deletions ui/v2.5/src/models/list-filter/movies.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import {
createMandatoryNumberCriterionOption,
createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption,
createMandatoryTimestampCriterionOption,
} from "./criteria/criterion";
Expand All @@ -10,6 +9,7 @@ import { StudiosCriterionOption } from "./criteria/studios";
import { PerformersCriterionOption } from "./criteria/performers";
import { ListFilterOptions } from "./filter-options";
import { DisplayMode } from "./types";
import { RatingCriterionOption } from "./criteria/rating";

const defaultSortBy = "name";

Expand All @@ -30,7 +30,7 @@ const criterionOptions = [
createStringCriterionOption("director"),
createStringCriterionOption("synopsis"),
createMandatoryNumberCriterionOption("duration"),
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
PerformersCriterionOption,
createDateCriterionOption("date"),
createMandatoryTimestampCriterionOption("created_at"),
Expand Down
7 changes: 4 additions & 3 deletions ui/v2.5/src/models/list-filter/performers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
createDateCriterionOption,
createMandatoryTimestampCriterionOption,
NumberCriterionOption,
NullNumberCriterionOption,
} from "./criteria/criterion";
import { FavoriteCriterionOption } from "./criteria/favorite";
import { GenderCriterionOption } from "./criteria/gender";
Expand All @@ -17,6 +16,8 @@ import { StudiosCriterionOption } from "./criteria/studios";
import { TagsCriterionOption } from "./criteria/tags";
import { ListFilterOptions } from "./filter-options";
import { CriterionType, DisplayMode } from "./types";
import { CountryCriterionOption } from "./criteria/country";
import { RatingCriterionOption } from "./criteria/rating";

const defaultSortBy = "name";
const sortByOptions = [
Expand Down Expand Up @@ -67,7 +68,6 @@ const stringCriteria: CriterionType[] = [
"disambiguation",
"details",
"ethnicity",
"country",
"hair_color",
"eye_color",
"measurements",
Expand All @@ -87,7 +87,7 @@ const criterionOptions = [
StudiosCriterionOption,
StashIDCriterionOption,
createStringCriterionOption("url"),
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
createMandatoryNumberCriterionOption("tag_count"),
createMandatoryNumberCriterionOption("scene_count"),
createMandatoryNumberCriterionOption("image_count"),
Expand All @@ -96,6 +96,7 @@ const criterionOptions = [
createBooleanCriterionOption("ignore_auto_tag"),
new NumberCriterionOption("height", "height_cm"),
...numberCriteria.map((c) => createNumberCriterionOption(c)),
CountryCriterionOption,
...stringCriteria.map((c) => createStringCriterionOption(c)),
createDateCriterionOption("birthdate"),
createDateCriterionOption("death_date"),
Expand Down
4 changes: 2 additions & 2 deletions ui/v2.5/src/models/list-filter/scenes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {
createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption,
createStringCriterionOption,
NullNumberCriterionOption,
createDateCriterionOption,
createMandatoryTimestampCriterionOption,
createPathCriterionOption,
Expand All @@ -28,6 +27,7 @@ import {
import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { CaptionsCriterionOption } from "./criteria/captions";
import { StashIDCriterionOption } from "./criteria/stash-ids";
import { RatingCriterionOption } from "./criteria/rating";

const defaultSortBy = "date";
const sortByOptions = [
Expand Down Expand Up @@ -68,7 +68,7 @@ const criterionOptions = [
PhashCriterionOption,
DuplicatedCriterionOption,
OrganizedCriterionOption,
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
createMandatoryNumberCriterionOption("o_counter"),
ResolutionCriterionOption,
createStringCriterionOption("video_codec"),
Expand Down
4 changes: 2 additions & 2 deletions ui/v2.5/src/models/list-filter/studios.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import {
createMandatoryNumberCriterionOption,
createMandatoryStringCriterionOption,
createStringCriterionOption,
NullNumberCriterionOption,
createMandatoryTimestampCriterionOption,
} from "./criteria/criterion";
import { StudioIsMissingCriterionOption } from "./criteria/is-missing";
import { RatingCriterionOption } from "./criteria/rating";
import { StashIDCriterionOption } from "./criteria/stash-ids";
import { ParentStudiosCriterionOption } from "./criteria/studios";
import { ListFilterOptions } from "./filter-options";
Expand Down Expand Up @@ -36,7 +36,7 @@ const criterionOptions = [
createStringCriterionOption("details"),
ParentStudiosCriterionOption,
StudioIsMissingCriterionOption,
new NullNumberCriterionOption("rating", "rating100"),
RatingCriterionOption,
createBooleanCriterionOption("ignore_auto_tag"),
createMandatoryNumberCriterionOption("scene_count"),
createMandatoryNumberCriterionOption("image_count"),
Expand Down

0 comments on commit da38ec0

Please sign in to comment.