From c79f299d1a4ebee1155141cd94564302478fbe54 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:32:11 +1000 Subject: [PATCH] Add clone methods to all criterion classes (#5109) --- .../models/list-filter/criteria/criterion.ts | 68 +++++++++++++------ .../models/list-filter/criteria/performers.ts | 7 ++ .../src/models/list-filter/criteria/phash.ts | 7 ++ .../src/models/list-filter/criteria/rating.ts | 17 +++-- .../models/list-filter/criteria/stash-ids.ts | 7 ++ 5 files changed, 81 insertions(+), 25 deletions(-) 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 2c36cf545..36ed39894 100644 --- a/ui/v2.5/src/models/list-filter/criteria/criterion.ts +++ b/ui/v2.5/src/models/list-filter/criteria/criterion.ts @@ -89,14 +89,7 @@ export abstract class Criterion { this.value = value; } - public clone(): Criterion { - const newCriterion = new (this.constructor as new ( - type: CriterionOption, - value: V - ) => Criterion)(this.criterionOption, this.value); - newCriterion.modifier = this.modifier; - return newCriterion; - } + public abstract clone(): Criterion; public static getModifierLabel(intl: IntlShape, modifier: CriterionModifier) { const modifierMessageID = modifierMessageIDs[modifier]; @@ -519,6 +512,13 @@ export class StringCriterion extends Criterion { super(type, ""); } + public clone() { + const newCriterion = new StringCriterion(this.criterionOption); + newCriterion.modifier = this.modifier; + newCriterion.value = this.value; + return newCriterion; + } + protected getLabelValue(_intl: IntlShape) { return this.value; } @@ -714,6 +714,17 @@ export function createMandatoryNumberCriterionOption( } export class NumberCriterion extends Criterion { + constructor(type: CriterionOption) { + super(type, { value: undefined, value2: undefined }); + } + + public clone() { + const newCriterion = new NumberCriterion(this.criterionOption); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public get value(): INumberValue { return this._value; } @@ -772,10 +783,6 @@ export class NumberCriterion extends Criterion { return true; } - - constructor(type: CriterionOption) { - super(type, { value: undefined, value2: undefined }); - } } export class DurationCriterionOption extends MandatoryNumberCriterionOption { @@ -796,6 +803,13 @@ export class DurationCriterion extends Criterion { super(type, { value: undefined, value2: undefined }); } + public clone() { + const newCriterion = new DurationCriterion(this.criterionOption); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public toCriterionInput(): IntCriterionInput { return { modifier: this.modifier, @@ -869,6 +883,17 @@ export function createDateCriterionOption(value: CriterionType) { } export class DateCriterion extends Criterion { + constructor(type: CriterionOption) { + super(type, { value: "", value2: undefined }); + } + + public clone() { + const newCriterion = new DateCriterion(this.criterionOption); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public encodeValue() { return { value: this.value.value, @@ -915,10 +940,6 @@ export class DateCriterion extends Criterion { return true; } - - constructor(type: CriterionOption) { - super(type, { value: "", value2: undefined }); - } } export class TimestampCriterionOption extends CriterionOption { @@ -968,6 +989,17 @@ export function createMandatoryTimestampCriterionOption(value: CriterionType) { } export class TimestampCriterion extends Criterion { + constructor(type: CriterionOption) { + super(type, { value: "", value2: undefined }); + } + + public clone() { + const newCriterion = new TimestampCriterion(this.criterionOption); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public encodeValue() { return { value: this.value?.value, @@ -1025,8 +1057,4 @@ export class TimestampCriterion extends Criterion { return true; } - - constructor(type: CriterionOption) { - super(type, { value: "", value2: undefined }); - } } diff --git a/ui/v2.5/src/models/list-filter/criteria/performers.ts b/ui/v2.5/src/models/list-filter/criteria/performers.ts index 3d29dd9dc..a4ce1a1bf 100644 --- a/ui/v2.5/src/models/list-filter/criteria/performers.ts +++ b/ui/v2.5/src/models/list-filter/criteria/performers.ts @@ -33,6 +33,13 @@ export class PerformersCriterion extends Criterion { super(PerformersCriterionOption, { items: [], excluded: [] }); } + public clone() { + const newCriterion = new PerformersCriterion(); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + override get modifier(): CriterionModifier { return this._modifier; } diff --git a/ui/v2.5/src/models/list-filter/criteria/phash.ts b/ui/v2.5/src/models/list-filter/criteria/phash.ts index 4887751b3..ea794c30e 100644 --- a/ui/v2.5/src/models/list-filter/criteria/phash.ts +++ b/ui/v2.5/src/models/list-filter/criteria/phash.ts @@ -29,6 +29,13 @@ export class PhashCriterion extends Criterion { super(PhashCriterionOption, { value: "", distance: 0 }); } + public clone() { + const newCriterion = new PhashCriterion(); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + protected getLabelValue() { const { value, distance } = this.value; if ( diff --git a/ui/v2.5/src/models/list-filter/criteria/rating.ts b/ui/v2.5/src/models/list-filter/criteria/rating.ts index b3feb85af..59760a53d 100644 --- a/ui/v2.5/src/models/list-filter/criteria/rating.ts +++ b/ui/v2.5/src/models/list-filter/criteria/rating.ts @@ -40,6 +40,18 @@ export const RatingCriterionOption = new CriterionOption({ export class RatingCriterion extends Criterion { ratingSystem: RatingSystemOptions; + constructor(ratingSystem: RatingSystemOptions) { + super(RatingCriterionOption, { value: 0, value2: undefined }); + this.ratingSystem = ratingSystem; + } + + public clone() { + const newCriterion = new RatingCriterion(this.ratingSystem); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public get value(): INumberValue { return this._value; } @@ -76,9 +88,4 @@ export class RatingCriterion extends Criterion { return `${convertToRatingFormat(value, this.ratingSystem) ?? 0}`; } } - - constructor(ratingSystem: RatingSystemOptions) { - super(RatingCriterionOption, { value: 0, value2: undefined }); - this.ratingSystem = ratingSystem; - } } diff --git a/ui/v2.5/src/models/list-filter/criteria/stash-ids.ts b/ui/v2.5/src/models/list-filter/criteria/stash-ids.ts index 951c88b41..0ea7b0655 100644 --- a/ui/v2.5/src/models/list-filter/criteria/stash-ids.ts +++ b/ui/v2.5/src/models/list-filter/criteria/stash-ids.ts @@ -27,6 +27,13 @@ export class StashIDCriterion extends Criterion { }); } + public clone() { + const newCriterion = new StashIDCriterion(); + newCriterion.modifier = this.modifier; + newCriterion.value = { ...this.value }; + return newCriterion; + } + public get value(): IStashIDValue { return this._value; }