diff --git a/frontend/src/Components/Form/FormInputGroup.tsx b/frontend/src/Components/Form/FormInputGroup.tsx index fe860a7ca..15e16a2e8 100644 --- a/frontend/src/Components/Form/FormInputGroup.tsx +++ b/frontend/src/Components/Form/FormInputGroup.tsx @@ -19,6 +19,7 @@ import DownloadClientSelectInput from './Select/DownloadClientSelectInput'; import EnhancedSelectInput from './Select/EnhancedSelectInput'; import IndexerFlagsSelectInput from './Select/IndexerFlagsSelectInput'; import IndexerSelectInput from './Select/IndexerSelectInput'; +import LanguageSelectInput from './Select/LanguageSelectInput'; import MonitorEpisodesSelectInput from './Select/MonitorEpisodesSelectInput'; import MonitorNewItemsSelectInput from './Select/MonitorNewItemsSelectInput'; import ProviderDataSelectInput from './Select/ProviderOptionSelectInput'; @@ -51,6 +52,9 @@ function getComponent(type: InputType) { case inputTypes.KEY_VALUE_LIST: return KeyValueListInput; + case inputTypes.LANGUAGE_SELECT: + return LanguageSelectInput; + case inputTypes.MONITOR_EPISODES_SELECT: return MonitorEpisodesSelectInput; diff --git a/frontend/src/Components/Form/Select/LanguageSelectInput.tsx b/frontend/src/Components/Form/Select/LanguageSelectInput.tsx index 80efde065..3c9bbc150 100644 --- a/frontend/src/Components/Form/Select/LanguageSelectInput.tsx +++ b/frontend/src/Components/Form/Select/LanguageSelectInput.tsx @@ -1,43 +1,95 @@ -import React, { useMemo } from 'react'; -import { EnhancedSelectInputChanged } from 'typings/inputs'; +import React, { useCallback, useMemo } from 'react'; +import { useSelector } from 'react-redux'; +import Language from 'Language/Language'; +import createFilteredLanguagesSelector from 'Store/Selectors/createFilteredLanguagesSelector'; +import translate from 'Utilities/String/translate'; import EnhancedSelectInput, { EnhancedSelectInputValue, } from './EnhancedSelectInput'; +interface LanguageSelectInputOnChangeProps { + name: string; + value: number | string | Language; +} + interface LanguageSelectInputProps { name: string; - value: number; - values: EnhancedSelectInputValue[]; - onChange: (change: EnhancedSelectInputChanged) => void; + value: number | string | Language; + includeNoChange: boolean; + includeNoChangeDisabled?: boolean; + includeMixed: boolean; + onChange: (payload: LanguageSelectInputOnChangeProps) => void; } -function LanguageSelectInput({ - values, +export default function LanguageSelectInput({ + value, + includeNoChange, + includeNoChangeDisabled, + includeMixed, onChange, ...otherProps }: LanguageSelectInputProps) { - const mappedValues = useMemo(() => { - const minId = values.reduce( - (min: number, v) => (v.key < 1 ? v.key : min), - values[0].key + const { items } = useSelector(createFilteredLanguagesSelector(true)); + + const values = useMemo(() => { + const result: EnhancedSelectInputValue[] = items.map( + (item) => { + return { + key: item.id, + value: item.name, + }; + } ); - return values.map(({ key, value }) => { - return { - key, - value, - dividerAfter: minId < 1 ? key === minId : false, - }; - }); - }, [values]); + if (includeNoChange) { + result.unshift({ + key: 'noChange', + value: translate('NoChange'), + isDisabled: includeNoChangeDisabled, + }); + } + + if (includeMixed) { + result.unshift({ + key: 'mixed', + value: `(${translate('Mixed')})`, + isDisabled: true, + }); + } + + return result; + }, [includeNoChange, includeNoChangeDisabled, includeMixed, items]); + + const selectValue = + typeof value === 'number' || typeof value === 'string' ? value : value.id; + + const handleChange = useCallback( + (payload: LanguageSelectInputOnChangeProps) => { + if (typeof value === 'number') { + onChange(payload); + } else { + const language = items.find((i) => i.id === payload.value); + + onChange({ + ...payload, + value: language + ? { + id: language.id, + name: language.name, + } + : ({ id: payload.value } as Language), + }); + } + }, + [value, items, onChange] + ); return ( ); } - -export default LanguageSelectInput; diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index 963967f15..00c5037d9 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -66,10 +66,10 @@ class UISettings extends Component { isFetching, error, settings, + languages, hasSettings, onInputChange, onSavePress, - languages, ...otherProps } = this.props; @@ -213,9 +213,8 @@ class UISettings extends Component { {translate('UiLanguage')} { + const { isFetching, isPopulated, error, items } = + languages as LanguageSettingsAppState; + + const filteredLanguages = items.filter( + (lang: Language) => !filterItems.includes(lang.name) + ); + + return { + isFetching, + isPopulated, + error, + items: filteredLanguages, + }; + }); +}