mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-04-19 21:46:43 -04:00
Fixed auto tagging tag specification
This commit is contained in:
@@ -139,11 +139,11 @@ 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 'seriesTag'
|
: C extends 'seriesTag'
|
||||||
? SeriesTagInputProps
|
? SeriesTagInputProps<V>
|
||||||
: C extends 'seriesTypeSelect'
|
: C extends 'seriesTypeSelect'
|
||||||
? SeriesTypeSelectInputProps
|
? SeriesTypeSelectInputProps
|
||||||
: C extends 'tag'
|
: C extends 'tag'
|
||||||
? SeriesTagInputProps
|
? SeriesTagInputProps<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 SeriesTag extends TagBase {
|
|||||||
name: string;
|
name: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SeriesTagInputProps {
|
export interface SeriesTagInputProps<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 createSeriesTagsSelector(tags: number[]) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function SeriesTagInput({
|
export default function SeriesTagInput<V extends number | number[]>({
|
||||||
name,
|
name,
|
||||||
value,
|
value,
|
||||||
onChange,
|
onChange,
|
||||||
}: SeriesTagInputProps) {
|
}: SeriesTagInputProps<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(
|
||||||
createSeriesTagsSelector(value)
|
createSeriesTagsSelector(arrayValue)
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleTagCreated = useCallback(
|
const handleTagCreated = useCallback(
|
||||||
(tag: SeriesTag) => {
|
(tag: SeriesTag) => {
|
||||||
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: SeriesTag) => {
|
(newTag: SeriesTag) => {
|
||||||
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 SeriesTagInput({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user