From 588d1a14f0f683fbb910f157945292fcebeb11be Mon Sep 17 00:00:00 2001 From: Gykes <24581046+Gykes@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:15:51 -0800 Subject: [PATCH] Consolidate frontend duplicate filter to single criterion --- .../models/list-filter/criteria/criterion.ts | 4 +- .../src/models/list-filter/criteria/phash.ts | 67 ++++++++----------- 2 files changed, 31 insertions(+), 40 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 8f30e5d17..ae23a48d4 100644 --- a/ui/v2.5/src/models/list-filter/criteria/criterion.ts +++ b/ui/v2.5/src/models/list-filter/criteria/criterion.ts @@ -12,6 +12,7 @@ import { import TextUtils from "src/utils/text"; import { CriterionType, + IDuplicationValue, IHierarchicalLabelValue, ILabeledId, INumberValue, @@ -36,7 +37,8 @@ export type CriterionValue = | IStashIDValue | IDateValue | ITimestampValue - | IPhashDistanceValue; + | IPhashDistanceValue + | IDuplicationValue; export interface ISavedCriterion { modifier: CriterionModifier; 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 cdebd3640..acca9fcb7 100644 --- a/ui/v2.5/src/models/list-filter/criteria/phash.ts +++ b/ui/v2.5/src/models/list-filter/criteria/phash.ts @@ -4,12 +4,7 @@ import { DuplicationCriterionInput, } from "src/core/generated-graphql"; import { IDuplicationValue, IPhashDistanceValue } from "../types"; -import { - Criterion, - CriterionOption, - ModifierCriterion, - ModifierCriterionOption, -} from "./criterion"; +import { ModifierCriterion, ModifierCriterionOption } from "./criterion"; import { IntlShape } from "react-intl"; // Shared mapping of duplication field IDs to their i18n message IDs @@ -73,29 +68,24 @@ export class PhashCriterion extends ModifierCriterion { } } -export const DuplicatedCriterionOption = new CriterionOption({ +export const DuplicatedCriterionOption = new ModifierCriterionOption({ messageID: "duplicated", type: "duplicated", + modifierOptions: [], // No modifiers for this filter + defaultModifier: CriterionModifier.Equals, makeCriterion: () => new DuplicatedCriterion(), }); -export class DuplicatedCriterion extends Criterion { - public value: IDuplicationValue = {}; - +export class DuplicatedCriterion extends ModifierCriterion { constructor() { - super(DuplicatedCriterionOption); - } - - public clone(): DuplicatedCriterion { - const c = new DuplicatedCriterion(); - c.value = { ...this.value }; - return c; + super(DuplicatedCriterionOption, {}); } public cloneValues() { this.value = { ...this.value }; } + // Override getLabel to provide custom formatting for duplication fields public getLabel(intl: IntlShape): string { const parts: string[] = []; const trueLabel = intl.formatMessage({ id: "true" }); @@ -124,7 +114,12 @@ export class DuplicatedCriterion extends Criterion { return parts.join(", "); } - public toCriterionInput(): DuplicationCriterionInput { + protected getLabelValue(_intl: IntlShape): string { + // Not used since we override getLabel, but required by abstract class + return ""; + } + + protected toCriterionInput(): DuplicationCriterionInput { return { duplicated: this.value.duplicated, distance: this.value.distance, @@ -135,33 +130,27 @@ export class DuplicatedCriterion extends Criterion { }; } - public toQueryParams(): Record { - return { - duplicated: this.value, - }; - } + // Override to handle legacy saved formats + public setFromSavedCriterion(criterion: unknown): void { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const c = criterion as any; - public fromDecodedParams(o: Record): void { - const params = o as { duplicated?: IDuplicationValue }; - if (params.duplicated) { - this.value = params.duplicated; - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public setFromSavedCriterion(criterion: any): void { // Handle various saved formats - if (criterion.value !== undefined) { + if (c.value !== undefined) { // New format: { value: { phash: true, ... } } - if (typeof criterion.value === "object") { - this.value = criterion.value as IDuplicationValue; - } else if (typeof criterion.value === "string") { + if (typeof c.value === "object") { + this.value = c.value as IDuplicationValue; + } else if (typeof c.value === "string") { // Legacy format: { value: "true" } - convert to phash - this.value = { phash: criterion.value === "true" }; + this.value = { phash: c.value === "true" }; } - } else if (typeof criterion === "object") { + } else if (typeof c === "object") { // Direct value format - this.value = criterion as IDuplicationValue; + this.value = c as IDuplicationValue; + } + + if (c.modifier) { + this.modifier = c.modifier; } }