diff --git a/ui/v2.5/src/components/Shared/DurationInput.tsx b/ui/v2.5/src/components/Shared/DurationInput.tsx index 2983d086c..e73e7adb6 100644 --- a/ui/v2.5/src/components/Shared/DurationInput.tsx +++ b/ui/v2.5/src/components/Shared/DurationInput.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from "react"; import { Button, ButtonGroup, InputGroup, Form } from "react-bootstrap"; import { Icon } from "src/components/Shared"; -import { TextUtils } from "src/utils"; +import { DurationUtils } from "src/utils"; interface IProps { disabled?: boolean; @@ -11,67 +11,21 @@ interface IProps { } export const DurationInput: React.FC = (props: IProps) => { - const [value, setValue] = useState( - secondsToString(props.numericValue) - ); + const [value, setValue] = useState(DurationUtils.secondsToString(props.numericValue)); useEffect(() => { - setValue(secondsToString(props.numericValue)); + setValue(DurationUtils.secondsToString(props.numericValue)); }, [props.numericValue]); - function secondsToString(seconds: number) { - let ret = TextUtils.secondsToTimestamp(seconds); - - if (ret.startsWith("00:")) { - ret = ret.substr(3); - - if (ret.startsWith("0")) { - ret = ret.substr(1); - } - } - - return ret; - } - - function stringToSeconds(v: string) { - if (!v) { - return 0; - } - - const splits = v.split(":"); - - if (splits.length > 3) { - return 0; - } - - let seconds = 0; - let factor = 1; - while (splits.length > 0) { - const thisSplit = splits.pop(); - if (thisSplit === undefined) { - return 0; - } - - const thisInt = parseInt(thisSplit, 10); - if (Number.isNaN(thisInt)) { - return 0; - } - - seconds += factor * thisInt; - factor *= 60; - } - - return seconds; - } function increment() { - let seconds = stringToSeconds(value); + let seconds = DurationUtils.stringToSeconds(value); seconds += 1; props.onValueChange(seconds); } function decrement() { - let seconds = stringToSeconds(value); + let seconds = DurationUtils.stringToSeconds(value); seconds -= 1; props.onValueChange(seconds); } @@ -112,7 +66,7 @@ export const DurationInput: React.FC = (props: IProps) => { disabled={props.disabled} value={value} onChange={(e: any) => setValue(e.target.value)} - onBlur={() => props.onValueChange(stringToSeconds(value))} + onBlur={() => props.onValueChange(DurationUtils.stringToSeconds(value))} placeholder="hh:mm:ss" /> diff --git a/ui/v2.5/src/components/list/AddFilter.tsx b/ui/v2.5/src/components/list/AddFilter.tsx index 43369b516..6d493a6d2 100644 --- a/ui/v2.5/src/components/list/AddFilter.tsx +++ b/ui/v2.5/src/components/list/AddFilter.tsx @@ -5,7 +5,8 @@ import { Icon, FilterSelect } from "src/components/Shared"; import { CriterionModifier } from "src/core/generated-graphql"; import { Criterion, - CriterionType + CriterionType, + DurationCriterion } from "src/models/list-filter/criteria/criterion"; import { NoneCriterion } from "src/models/list-filter/criteria/none"; import { PerformersCriterion } from "src/models/list-filter/criteria/performers"; @@ -13,6 +14,7 @@ import { StudiosCriterion } from "src/models/list-filter/criteria/studios"; import { TagsCriterion } from "src/models/list-filter/criteria/tags"; import { makeCriteria } from "src/models/list-filter/criteria/utils"; import { ListFilterModel } from "src/models/list-filter/filter"; +import { DurationInput } from "src/components/Shared"; interface IAddFilterProps { onAddCriterion: (criterion: Criterion, oldId?: string) => void; @@ -66,6 +68,11 @@ export const AddFilter: React.FC = ( valueStage.current = event.target.value; } + function onChangedDuration(valueAsNumber: number) { + valueStage.current = valueAsNumber; + onBlurInput(); + } + function onBlurInput() { const newCriterion = _.cloneDeep(criterion); newCriterion.value = valueStage.current; @@ -170,6 +177,15 @@ export const AddFilter: React.FC = ( ); } + if (criterion instanceof DurationCriterion) { + // render duration control + return ( + + ) + } return ( { return "Rating"; case "resolution": return "Resolution"; + case "duration": return "Duration"; case "favorite": return "Favorite"; case "hasMarkers": @@ -144,13 +147,18 @@ export abstract class Criterion