mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
Fix rating and country filters (#4105)
* Fix country criterion * Fixing rating criterion
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
PHashDuplicationCriterionInput,
|
||||
DateCriterionInput,
|
||||
TimestampCriterionInput,
|
||||
ConfigDataFragment,
|
||||
} from "src/core/generated-graphql";
|
||||
import DurationUtils from "src/utils/duration";
|
||||
import {
|
||||
@@ -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;
|
||||
@@ -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) {
|
||||
@@ -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),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@ const filterModeOptions = {
|
||||
|
||||
export function makeCriteria(
|
||||
mode: GQL.FilterMode,
|
||||
type: CriterionType = "none"
|
||||
type: CriterionType,
|
||||
config?: GQL.ConfigDataFragment
|
||||
) {
|
||||
const criterionOptions = filterModeOptions[mode];
|
||||
|
||||
@@ -32,5 +33,5 @@ export function makeCriteria(
|
||||
throw new Error(`Unknown criterion parameter name: ${type}`);
|
||||
}
|
||||
|
||||
return option?.makeCriterion();
|
||||
return option?.makeCriterion(config);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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]);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {
|
||||
createMandatoryNumberCriterionOption,
|
||||
createStringCriterionOption,
|
||||
NullNumberCriterionOption,
|
||||
createDateCriterionOption,
|
||||
createMandatoryTimestampCriterionOption,
|
||||
createPathCriterionOption,
|
||||
@@ -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";
|
||||
|
||||
@@ -46,7 +46,7 @@ const criterionOptions = [
|
||||
createStringCriterionOption("details"),
|
||||
createPathCriterionOption("path"),
|
||||
createStringCriterionOption("checksum", "media_info.checksum"),
|
||||
new NullNumberCriterionOption("rating", "rating100"),
|
||||
RatingCriterionOption,
|
||||
OrganizedCriterionOption,
|
||||
AverageResolutionCriterionOption,
|
||||
GalleryIsMissingCriterionOption,
|
||||
|
||||
@@ -2,7 +2,6 @@ import {
|
||||
createMandatoryNumberCriterionOption,
|
||||
createMandatoryStringCriterionOption,
|
||||
createStringCriterionOption,
|
||||
NullNumberCriterionOption,
|
||||
createMandatoryTimestampCriterionOption,
|
||||
createDateCriterionOption,
|
||||
createPathCriterionOption,
|
||||
@@ -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 {
|
||||
@@ -40,7 +40,7 @@ const criterionOptions = [
|
||||
ResolutionCriterionOption,
|
||||
ImageIsMissingCriterionOption,
|
||||
TagsCriterionOption,
|
||||
new NullNumberCriterionOption("rating", "rating100"),
|
||||
RatingCriterionOption,
|
||||
createMandatoryNumberCriterionOption("tag_count"),
|
||||
PerformerTagsCriterionOption,
|
||||
PerformersCriterionOption,
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {
|
||||
createMandatoryNumberCriterionOption,
|
||||
createStringCriterionOption,
|
||||
NullNumberCriterionOption,
|
||||
createDateCriterionOption,
|
||||
createMandatoryTimestampCriterionOption,
|
||||
} from "./criteria/criterion";
|
||||
@@ -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";
|
||||
|
||||
@@ -30,7 +30,7 @@ const criterionOptions = [
|
||||
createStringCriterionOption("director"),
|
||||
createStringCriterionOption("synopsis"),
|
||||
createMandatoryNumberCriterionOption("duration"),
|
||||
new NullNumberCriterionOption("rating", "rating100"),
|
||||
RatingCriterionOption,
|
||||
PerformersCriterionOption,
|
||||
createDateCriterionOption("date"),
|
||||
createMandatoryTimestampCriterionOption("created_at"),
|
||||
|
||||
@@ -6,7 +6,6 @@ import {
|
||||
createDateCriterionOption,
|
||||
createMandatoryTimestampCriterionOption,
|
||||
NumberCriterionOption,
|
||||
NullNumberCriterionOption,
|
||||
} from "./criteria/criterion";
|
||||
import { FavoriteCriterionOption } from "./criteria/favorite";
|
||||
import { GenderCriterionOption } from "./criteria/gender";
|
||||
@@ -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 = [
|
||||
@@ -67,7 +68,6 @@ const stringCriteria: CriterionType[] = [
|
||||
"disambiguation",
|
||||
"details",
|
||||
"ethnicity",
|
||||
"country",
|
||||
"hair_color",
|
||||
"eye_color",
|
||||
"measurements",
|
||||
@@ -87,7 +87,7 @@ const criterionOptions = [
|
||||
StudiosCriterionOption,
|
||||
StashIDCriterionOption,
|
||||
createStringCriterionOption("url"),
|
||||
new NullNumberCriterionOption("rating", "rating100"),
|
||||
RatingCriterionOption,
|
||||
createMandatoryNumberCriterionOption("tag_count"),
|
||||
createMandatoryNumberCriterionOption("scene_count"),
|
||||
createMandatoryNumberCriterionOption("image_count"),
|
||||
@@ -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"),
|
||||
|
||||
@@ -2,7 +2,6 @@ import {
|
||||
createMandatoryNumberCriterionOption,
|
||||
createMandatoryStringCriterionOption,
|
||||
createStringCriterionOption,
|
||||
NullNumberCriterionOption,
|
||||
createDateCriterionOption,
|
||||
createMandatoryTimestampCriterionOption,
|
||||
createPathCriterionOption,
|
||||
@@ -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 = [
|
||||
@@ -68,7 +68,7 @@ const criterionOptions = [
|
||||
PhashCriterionOption,
|
||||
DuplicatedCriterionOption,
|
||||
OrganizedCriterionOption,
|
||||
new NullNumberCriterionOption("rating", "rating100"),
|
||||
RatingCriterionOption,
|
||||
createMandatoryNumberCriterionOption("o_counter"),
|
||||
ResolutionCriterionOption,
|
||||
createStringCriterionOption("video_codec"),
|
||||
|
||||
@@ -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";
|
||||
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user