mirror of
https://github.com/Sonarr/Sonarr.git
synced 2025-04-23 22:07:07 -04:00
Improve LanguageSelectInput
This commit is contained in:
parent
202190d032
commit
936cf699ff
4 changed files with 111 additions and 28 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 LanguageSelectInputProps {
|
||||
interface LanguageSelectInputOnChangeProps {
|
||||
name: string;
|
||||
value: number;
|
||||
values: EnhancedSelectInputValue<number>[];
|
||||
onChange: (change: EnhancedSelectInputChanged<number>) => void;
|
||||
value: number | string | Language;
|
||||
}
|
||||
|
||||
function LanguageSelectInput({
|
||||
values,
|
||||
interface LanguageSelectInputProps {
|
||||
name: string;
|
||||
value: number | string | Language;
|
||||
includeNoChange: boolean;
|
||||
includeNoChangeDisabled?: boolean;
|
||||
includeMixed: boolean;
|
||||
onChange: (payload: LanguageSelectInputOnChangeProps) => void;
|
||||
}
|
||||
|
||||
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<number | string>[] = 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 (
|
||||
<EnhancedSelectInput
|
||||
{...otherProps}
|
||||
values={mappedValues}
|
||||
onChange={onChange}
|
||||
value={selectValue}
|
||||
values={values}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default LanguageSelectInput;
|
||||
|
|
|
@ -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 {
|
|||
<FormGroup>
|
||||
<FormLabel>{translate('UiLanguage')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
type={inputTypes.LANGUAGE_SELECT}
|
||||
name="uiLanguage"
|
||||
values={languages}
|
||||
helpText={translate('UiLanguageHelpText')}
|
||||
helpTextWarning={translate('BrowserReloadRequired')}
|
||||
onChange={onInputChange}
|
||||
|
@ -244,8 +243,8 @@ UISettings.propTypes = {
|
|||
isFetching: PropTypes.bool.isRequired,
|
||||
error: PropTypes.object,
|
||||
settings: PropTypes.object.isRequired,
|
||||
hasSettings: PropTypes.bool.isRequired,
|
||||
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
hasSettings: PropTypes.bool.isRequired,
|
||||
onSavePress: PropTypes.func.isRequired,
|
||||
onInputChange: PropTypes.func.isRequired
|
||||
};
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
import { createSelector } from 'reselect';
|
||||
import { LanguageSettingsAppState } from 'App/State/SettingsAppState';
|
||||
import Language from 'Language/Language';
|
||||
import createLanguagesSelector from './createLanguagesSelector';
|
||||
|
||||
export default function createFilteredLanguagesSelector(filterUnknown = false) {
|
||||
const filterItems = ['Any', 'Original'];
|
||||
|
||||
if (filterUnknown) {
|
||||
filterItems.push('Unknown');
|
||||
}
|
||||
|
||||
return createSelector(createLanguagesSelector(), (languages) => {
|
||||
const { isFetching, isPopulated, error, items } =
|
||||
languages as LanguageSettingsAppState;
|
||||
|
||||
const filteredLanguages = items.filter(
|
||||
(lang: Language) => !filterItems.includes(lang.name)
|
||||
);
|
||||
|
||||
return {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
error,
|
||||
items: filteredLanguages,
|
||||
};
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue