1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-18 21:35:51 -04:00

Fixed: Autotagging using tag specification

This commit is contained in:
Bogdan
2025-04-18 10:14:38 +03:00
parent e759f3fd0b
commit 9ef7c2a0b4
2 changed files with 41 additions and 17 deletions
@@ -120,7 +120,7 @@ type PickProps<V, C extends InputType> = C extends 'text'
: C extends 'monitorMoviesSelect' : C extends 'monitorMoviesSelect'
? MonitorMoviesSelectInputProps ? MonitorMoviesSelectInputProps
: C extends 'movieTag' : C extends 'movieTag'
? MovieTagInputProps ? MovieTagInputProps<V>
: C extends 'number' : C extends 'number'
? NumberInputProps ? NumberInputProps
: C extends 'oauth' : C extends 'oauth'
@@ -137,7 +137,7 @@ type PickProps<V, C extends InputType> = C extends 'text'
? // eslint-disable-next-line @typescript-eslint/no-explicit-any ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
EnhancedSelectInputProps<any, V> EnhancedSelectInputProps<any, V>
: C extends 'tag' : C extends 'tag'
? MovieTagInputProps ? MovieTagInputProps<V>
: C extends 'tagSelect' : C extends 'tagSelect'
? TagSelectInputProps ? TagSelectInputProps
: C extends 'text' : C extends 'text'
@@ -1,4 +1,4 @@
import React, { useCallback } from 'react'; import React, { useCallback, useMemo } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { addTag } from 'Store/Actions/tagActions'; import { addTag } from 'Store/Actions/tagActions';
@@ -12,10 +12,10 @@ interface MovieTag extends TagBase {
name: string; name: string;
} }
export interface MovieTagInputProps { export interface MovieTagInputProps<V> {
name: string; name: string;
value: number[]; value: V;
onChange: (change: InputChanged<number[]>) => void; onChange: (change: InputChanged<V>) => void;
} }
const VALID_TAG_REGEX = new RegExp('[^-_a-z0-9]', 'i'); const VALID_TAG_REGEX = new RegExp('[^-_a-z0-9]', 'i');
@@ -59,28 +59,48 @@ function createMovieTagsSelector(tags: number[]) {
}); });
} }
export default function MovieTagInput({ export default function MovieTagInput<V>({
name, name,
value, value,
onChange, onChange,
}: MovieTagInputProps) { }: MovieTagInputProps<V>) {
const dispatch = useDispatch(); const dispatch = useDispatch();
const isArray = Array.isArray(value);
const arrayValue = useMemo(() => {
if (isArray) {
return value as number[];
}
return value === 0 ? [] : [value as number];
}, [isArray, value]);
const { tags, tagList, allTags } = useSelector( const { tags, tagList, allTags } = useSelector(
createMovieTagsSelector(value) createMovieTagsSelector(arrayValue)
); );
const handleTagCreated = useCallback( const handleTagCreated = useCallback(
(tag: MovieTag) => { (tag: MovieTag) => {
onChange({ name, value: [...value, tag.id] }); if (isArray) {
onChange({ name, value: [...value, tag.id] as V });
} else {
onChange({
name,
value: tag.id as V,
});
}
}, },
[name, value, onChange] [name, value, isArray, onChange]
); );
const handleTagAdd = useCallback( const handleTagAdd = useCallback(
(newTag: MovieTag) => { (newTag: MovieTag) => {
if (newTag.id) { if (newTag.id) {
onChange({ name, value: [...value, newTag.id] }); if (isArray) {
onChange({ name, value: [...value, newTag.id] as V });
} else {
onChange({ name, value: newTag.id as V });
}
return; return;
} }
@@ -96,17 +116,21 @@ export default function MovieTagInput({
); );
} }
}, },
[name, value, allTags, handleTagCreated, onChange, dispatch] [name, value, isArray, allTags, handleTagCreated, onChange, dispatch]
); );
const handleTagDelete = useCallback( const handleTagDelete = useCallback(
({ index }: { index: number }) => { ({ index }: { index: number }) => {
const newValue = value.slice(); if (isArray) {
newValue.splice(index, 1); const newValue = value.slice();
newValue.splice(index, 1);
onChange({ name, value: newValue }); onChange({ name, value: newValue as V });
} else {
onChange({ name, value: 0 as V });
}
}, },
[name, value, onChange] [name, value, isArray, onChange]
); );
return ( return (