mirror of
https://github.com/Radarr/Radarr
synced 2026-01-25 00:41:50 +01:00
Merge pull request #66 from cheir-mneme/fix/p2-ci-tooling
fix(ci): P2 improvements - editorconfig, integration tests, Prettier 3
This commit is contained in:
commit
f7fca51da7
110 changed files with 474 additions and 297 deletions
|
|
@ -5,7 +5,7 @@ root = true
|
|||
# NOTE: Requires **VS2019 16.3** or later
|
||||
|
||||
# Stylecop.ruleset
|
||||
# Description: Rules for Radarr
|
||||
# Description: Rules for Aletheia
|
||||
|
||||
# Code files
|
||||
[*.cs]
|
||||
|
|
@ -18,12 +18,6 @@ indent_size = 4
|
|||
# Sort using and Import directives with System.* appearing first
|
||||
dotnet_sort_system_directives_first = true
|
||||
|
||||
# Avoid "this." and "Me." if not necessary
|
||||
dotnet_style_qualification_for_field = false:refactoring
|
||||
dotnet_style_qualification_for_property = false:refactoring
|
||||
dotnet_style_qualification_for_method = false:refactoring
|
||||
dotnet_style_qualification_for_event = false:refactoring
|
||||
|
||||
# Indentation preferences
|
||||
csharp_indent_block_contents = true
|
||||
csharp_indent_braces = false
|
||||
|
|
@ -32,10 +26,13 @@ csharp_indent_case_contents_when_block = true
|
|||
csharp_indent_switch_labels = true
|
||||
csharp_indent_labels = flush_left
|
||||
|
||||
# Avoid "this." and "Me." if not necessary
|
||||
dotnet_style_qualification_for_field = false:suggestion
|
||||
dotnet_style_qualification_for_property = false:suggestion
|
||||
dotnet_style_qualification_for_method = false:suggestion
|
||||
dotnet_style_qualification_for_event = false:suggestion
|
||||
|
||||
# Naming conventions
|
||||
dotnet_naming_style.instance_field_style.capitalization = camel_case
|
||||
dotnet_naming_style.instance_field_style.required_prefix = _
|
||||
|
||||
|
|
|
|||
13
.github/workflows/build.yml
vendored
13
.github/workflows/build.yml
vendored
|
|
@ -93,10 +93,21 @@ jobs:
|
|||
cp _tests/net8.0/linux-x64/publish/*.json _tests/ 2>/dev/null || true
|
||||
find _tests -name "Radarr.Test.Dummy" -exec chmod a+x {} \;
|
||||
|
||||
- name: Test with coverage
|
||||
- name: Unit tests with coverage
|
||||
shell: bash
|
||||
run: ./test.sh Linux Unit Coverage
|
||||
|
||||
- name: Integration tests
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p bin
|
||||
cp -r _output/net8.0/linux-x64/publish/* bin/
|
||||
chmod +x bin/Radarr
|
||||
./test.sh Linux Integration Test
|
||||
# Integration tests may fail in CI without full environment setup
|
||||
# Remove continue-on-error once tests are stable
|
||||
continue-on-error: true
|
||||
|
||||
- name: Report test results
|
||||
uses: dorny/test-reporter@v2
|
||||
if: always()
|
||||
|
|
|
|||
|
|
@ -27,7 +27,9 @@ interface BlocklistFilterModalProps {
|
|||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function BlocklistFilterModal(props: Readonly<BlocklistFilterModalProps>) {
|
||||
export default function BlocklistFilterModal(
|
||||
props: Readonly<BlocklistFilterModalProps>
|
||||
) {
|
||||
const sectionItems = useSelector(createBlocklistSelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'blocklist';
|
||||
|
|
|
|||
|
|
@ -74,7 +74,10 @@ interface HistoryEventTypeCellProps {
|
|||
data: HistoryData;
|
||||
}
|
||||
|
||||
function HistoryEventTypeCell({ eventType, data }: Readonly<HistoryEventTypeCellProps>) {
|
||||
function HistoryEventTypeCell({
|
||||
eventType,
|
||||
data,
|
||||
}: Readonly<HistoryEventTypeCellProps>) {
|
||||
const iconName = getIconName(eventType, data);
|
||||
const iconKind = getIconKind(eventType);
|
||||
const tooltip = getTooltip(eventType, data);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,9 @@ interface HistoryFilterModalProps {
|
|||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function HistoryFilterModal(props: Readonly<HistoryFilterModalProps>) {
|
||||
export default function HistoryFilterModal(
|
||||
props: Readonly<HistoryFilterModalProps>
|
||||
) {
|
||||
const sectionItems = useSelector(createHistorySelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'history';
|
||||
|
|
|
|||
|
|
@ -27,7 +27,9 @@ interface QueueFilterModalProps {
|
|||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function QueueFilterModal(props: Readonly<QueueFilterModalProps>) {
|
||||
export default function QueueFilterModal(
|
||||
props: Readonly<QueueFilterModalProps>
|
||||
) {
|
||||
const sectionItems = useSelector(createQueueSelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'queue';
|
||||
|
|
|
|||
|
|
@ -63,8 +63,7 @@ export interface AppSectionItemState<T> {
|
|||
}
|
||||
|
||||
export interface AppSectionProviderState<T>
|
||||
extends AppSectionDeleteState,
|
||||
AppSectionSaveState {
|
||||
extends AppSectionDeleteState, AppSectionSaveState {
|
||||
isFetching: boolean;
|
||||
isPopulated: boolean;
|
||||
isTesting?: boolean;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ import AppSectionState, {
|
|||
} from './AppSectionState';
|
||||
|
||||
interface BlocklistAppState
|
||||
extends AppSectionState<Blocklist>,
|
||||
extends
|
||||
AppSectionState<Blocklist>,
|
||||
AppSectionFilterState<Blocklist>,
|
||||
PagedAppSectionState,
|
||||
TableAppSectionState {
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ interface CalendarOptions {
|
|||
}
|
||||
|
||||
interface CalendarAppState
|
||||
extends AppSectionState<CalendarItem>,
|
||||
AppSectionFilterState<CalendarItem> {
|
||||
extends AppSectionState<CalendarItem>, AppSectionFilterState<CalendarItem> {
|
||||
searchMissingCommandId: number | null;
|
||||
start: moment.Moment;
|
||||
end: moment.Moment;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import AppSectionState, {
|
|||
import { CustomFilter } from './AppState';
|
||||
|
||||
interface CustomFiltersAppState
|
||||
extends AppSectionState<CustomFilter>,
|
||||
AppSectionDeleteState {}
|
||||
extends AppSectionState<CustomFilter>, AppSectionDeleteState {}
|
||||
|
||||
export default CustomFiltersAppState;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@ import History from 'typings/History';
|
|||
export type MovieHistoryAppState = AppSectionState<History>;
|
||||
|
||||
interface HistoryAppState
|
||||
extends AppSectionState<History>,
|
||||
extends
|
||||
AppSectionState<History>,
|
||||
AppSectionFilterState<History>,
|
||||
PagedAppSectionState,
|
||||
TableAppSectionState {}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ import AppSectionState, {
|
|||
import MovieCollection from 'typings/MovieCollection';
|
||||
|
||||
interface MovieCollectionAppState
|
||||
extends AppSectionState<MovieCollection>,
|
||||
extends
|
||||
AppSectionState<MovieCollection>,
|
||||
AppSectionFilterState<MovieCollection>,
|
||||
AppSectionSaveState {
|
||||
itemMap: Record<number, number>;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import AppSectionState, {
|
|||
import { MovieFile } from 'MovieFile/MovieFile';
|
||||
|
||||
interface MovieFilesAppState
|
||||
extends AppSectionState<MovieFile>,
|
||||
AppSectionDeleteState {}
|
||||
extends AppSectionState<MovieFile>, AppSectionDeleteState {}
|
||||
|
||||
export default MovieFilesAppState;
|
||||
|
|
|
|||
|
|
@ -56,9 +56,7 @@ export interface MovieIndexAppState {
|
|||
}
|
||||
|
||||
interface MoviesAppState
|
||||
extends AppSectionState<Movie>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {
|
||||
extends AppSectionState<Movie>, AppSectionDeleteState, AppSectionSaveState {
|
||||
itemMap: Record<number, number>;
|
||||
|
||||
deleteOptions: {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ export interface QueueDetailsAppState extends AppSectionState<Queue> {
|
|||
}
|
||||
|
||||
export interface QueuePagedAppState
|
||||
extends AppSectionState<Queue>,
|
||||
extends
|
||||
AppSectionState<Queue>,
|
||||
AppSectionFilterState<Queue>,
|
||||
PagedAppSectionState,
|
||||
TableAppSectionState {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import AppSectionState, {
|
|||
import Release from 'typings/Release';
|
||||
|
||||
interface ReleasesAppState
|
||||
extends AppSectionState<Release>,
|
||||
AppSectionFilterState<Release> {}
|
||||
extends AppSectionState<Release>, AppSectionFilterState<Release> {}
|
||||
|
||||
export default ReleasesAppState;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ import AppSectionState, {
|
|||
import RootFolder from 'typings/RootFolder';
|
||||
|
||||
interface RootFolderAppState
|
||||
extends AppSectionState<RootFolder>,
|
||||
extends
|
||||
AppSectionState<RootFolder>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,44 +32,46 @@ type Presets<T> = T & {
|
|||
};
|
||||
|
||||
export interface AutoTaggingAppState
|
||||
extends AppSectionState<AutoTagging>,
|
||||
extends
|
||||
AppSectionState<AutoTagging>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {}
|
||||
|
||||
export interface AutoTaggingSpecificationAppState
|
||||
extends AppSectionState<AutoTaggingSpecification>,
|
||||
extends
|
||||
AppSectionState<AutoTaggingSpecification>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState,
|
||||
AppSectionSchemaState<AutoTaggingSpecification> {}
|
||||
|
||||
export interface DelayProfileAppState
|
||||
extends AppSectionState<DelayProfile>,
|
||||
extends
|
||||
AppSectionState<DelayProfile>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {}
|
||||
|
||||
export interface DownloadClientAppState
|
||||
extends AppSectionState<DownloadClient>,
|
||||
extends
|
||||
AppSectionState<DownloadClient>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {
|
||||
isTestingAll: boolean;
|
||||
}
|
||||
|
||||
export interface GeneralAppState
|
||||
extends AppSectionItemState<General>,
|
||||
AppSectionSaveState {}
|
||||
extends AppSectionItemState<General>, AppSectionSaveState {}
|
||||
|
||||
export interface MediaManagementAppState
|
||||
extends AppSectionItemState<MediaManagement>,
|
||||
AppSectionSaveState {}
|
||||
extends AppSectionItemState<MediaManagement>, AppSectionSaveState {}
|
||||
|
||||
export interface NamingAppState
|
||||
extends AppSectionItemState<NamingConfig>,
|
||||
AppSectionSaveState {}
|
||||
extends AppSectionItemState<NamingConfig>, AppSectionSaveState {}
|
||||
|
||||
export type NamingExamplesAppState = AppSectionItemState<NamingExample>;
|
||||
|
||||
export interface ImportListAppState
|
||||
extends AppSectionState<ImportList>,
|
||||
extends
|
||||
AppSectionState<ImportList>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState,
|
||||
AppSectionSchemaState<Presets<ImportList>> {
|
||||
|
|
@ -77,11 +79,11 @@ export interface ImportListAppState
|
|||
}
|
||||
|
||||
export interface IndexerOptionsAppState
|
||||
extends AppSectionItemState<IndexerOptions>,
|
||||
AppSectionSaveState {}
|
||||
extends AppSectionItemState<IndexerOptions>, AppSectionSaveState {}
|
||||
|
||||
export interface IndexerAppState
|
||||
extends AppSectionState<Indexer>,
|
||||
extends
|
||||
AppSectionState<Indexer>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState,
|
||||
AppSectionSchemaState<Presets<Indexer>> {
|
||||
|
|
@ -89,30 +91,30 @@ export interface IndexerAppState
|
|||
}
|
||||
|
||||
export interface NotificationAppState
|
||||
extends AppSectionState<Notification>,
|
||||
AppSectionDeleteState {}
|
||||
extends AppSectionState<Notification>, AppSectionDeleteState {}
|
||||
|
||||
export interface QualityProfilesAppState
|
||||
extends AppSectionState<QualityProfile>,
|
||||
extends
|
||||
AppSectionState<QualityProfile>,
|
||||
AppSectionItemSchemaState<QualityProfile> {}
|
||||
|
||||
export interface ReleaseProfilesAppState
|
||||
extends AppSectionState<ReleaseProfile>,
|
||||
AppSectionSaveState {
|
||||
extends AppSectionState<ReleaseProfile>, AppSectionSaveState {
|
||||
pendingChanges: Partial<ReleaseProfile>;
|
||||
}
|
||||
|
||||
export interface CustomFormatAppState
|
||||
extends AppSectionState<CustomFormat>,
|
||||
extends
|
||||
AppSectionState<CustomFormat>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {}
|
||||
|
||||
export interface ImportListOptionsSettingsAppState
|
||||
extends AppSectionItemState<ImportListOptionsSettings>,
|
||||
AppSectionSaveState {}
|
||||
extends AppSectionItemState<ImportListOptionsSettings>, AppSectionSaveState {}
|
||||
|
||||
export interface ImportListExclusionsSettingsAppState
|
||||
extends AppSectionState<ImportListExclusion>,
|
||||
extends
|
||||
AppSectionState<ImportListExclusion>,
|
||||
AppSectionSaveState,
|
||||
PagedAppSectionState,
|
||||
AppSectionDeleteState {
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ export interface TagDetail extends ModelBase {
|
|||
}
|
||||
|
||||
export interface TagDetailAppState
|
||||
extends AppSectionState<TagDetail>,
|
||||
extends
|
||||
AppSectionState<TagDetail>,
|
||||
AppSectionDeleteState,
|
||||
AppSectionSaveState {}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,13 +10,15 @@ interface WantedMovie extends Movie {
|
|||
}
|
||||
|
||||
interface WantedCutoffUnmetAppState
|
||||
extends AppSectionState<WantedMovie>,
|
||||
extends
|
||||
AppSectionState<WantedMovie>,
|
||||
AppSectionFilterState<WantedMovie>,
|
||||
PagedAppSectionState,
|
||||
TableAppSectionState {}
|
||||
|
||||
interface WantedMissingAppState
|
||||
extends AppSectionState<WantedMovie>,
|
||||
extends
|
||||
AppSectionState<WantedMovie>,
|
||||
AppSectionFilterState<WantedMovie>,
|
||||
PagedAppSectionState,
|
||||
TableAppSectionState {}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,9 @@ interface CalendarFilterModalProps {
|
|||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function CalendarFilterModal(props: Readonly<CalendarFilterModalProps>) {
|
||||
export default function CalendarFilterModal(
|
||||
props: Readonly<CalendarFilterModalProps>
|
||||
) {
|
||||
const sectionItems = useSelector(createCalendarSelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'calendar';
|
||||
|
|
|
|||
|
|
@ -3,8 +3,10 @@ import { CalendarView } from 'Calendar/calendarViews';
|
|||
import Button, { ButtonProps } from 'Components/Link/Button';
|
||||
import titleCase from 'Utilities/String/titleCase';
|
||||
|
||||
interface CalendarHeaderViewButtonProps
|
||||
extends Omit<ButtonProps, 'children' | 'onPress'> {
|
||||
interface CalendarHeaderViewButtonProps extends Omit<
|
||||
ButtonProps,
|
||||
'children' | 'onPress'
|
||||
> {
|
||||
view: CalendarView;
|
||||
selectedView: CalendarView;
|
||||
onPress: (view: CalendarView) => void;
|
||||
|
|
|
|||
|
|
@ -7,8 +7,7 @@ import AddNewMovieCollectionMovieModalContent, {
|
|||
AddNewMovieCollectionMovieModalContentProps,
|
||||
} from './AddNewMovieCollectionMovieModalContent';
|
||||
|
||||
interface AddNewCollectionMovieModalProps
|
||||
extends AddNewMovieCollectionMovieModalContentProps {
|
||||
interface AddNewCollectionMovieModalProps extends AddNewMovieCollectionMovieModalContentProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import EditMovieCollectionModalContent, {
|
|||
EditMovieCollectionModalContentProps,
|
||||
} from './EditMovieCollectionModalContent';
|
||||
|
||||
interface EditMovieCollectionModalProps
|
||||
extends EditMovieCollectionModalContentProps {
|
||||
interface EditMovieCollectionModalProps extends EditMovieCollectionModalContentProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ export interface DescriptionListItemTitleProps {
|
|||
children?: ReactNode;
|
||||
}
|
||||
|
||||
function DescriptionListItemTitle(props: Readonly<DescriptionListItemTitleProps>) {
|
||||
function DescriptionListItemTitle(
|
||||
props: Readonly<DescriptionListItemTitleProps>
|
||||
) {
|
||||
const { className = styles.title, children } = props;
|
||||
|
||||
return <dt className={className}>{children}</dt>;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,11 @@ interface FieldSetProps {
|
|||
children?: React.ReactNode;
|
||||
}
|
||||
|
||||
function FieldSet({ size = sizes.MEDIUM, legend, children }: Readonly<FieldSetProps>) {
|
||||
function FieldSet({
|
||||
size = sizes.MEDIUM,
|
||||
legend,
|
||||
children,
|
||||
}: Readonly<FieldSetProps>) {
|
||||
return (
|
||||
<fieldset className={styles.fieldSet}>
|
||||
<legend
|
||||
|
|
|
|||
|
|
@ -46,7 +46,9 @@ export interface FileBrowserModalContentProps {
|
|||
onModalClose: () => void;
|
||||
}
|
||||
|
||||
function FileBrowserModalContent(props: Readonly<FileBrowserModalContentProps>) {
|
||||
function FileBrowserModalContent(
|
||||
props: Readonly<FileBrowserModalContentProps>
|
||||
) {
|
||||
const { name, value, includeFiles = true, onChange, onModalClose } = props;
|
||||
|
||||
const dispatch = useDispatch();
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@ import createLanguagesSelector from 'Store/Selectors/createLanguagesSelector';
|
|||
import FilterBuilderRowValue from './FilterBuilderRowValue';
|
||||
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
|
||||
|
||||
function LanguageFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
|
||||
function LanguageFilterBuilderRowValue(
|
||||
props: Readonly<FilterBuilderRowValueProps>
|
||||
) {
|
||||
const { items } = useSelector(createLanguagesSelector());
|
||||
|
||||
return <FilterBuilderRowValue {...props} tagList={items} />;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ import sortByProp from 'Utilities/Array/sortByProp';
|
|||
import FilterBuilderRowValue from './FilterBuilderRowValue';
|
||||
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
|
||||
|
||||
function MovieFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
|
||||
function MovieFilterBuilderRowValue(
|
||||
props: Readonly<FilterBuilderRowValueProps>
|
||||
) {
|
||||
const allMovies: Movie[] = useSelector(createAllMoviesSelector());
|
||||
|
||||
const tagList = allMovies
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@ const statusTagList = [
|
|||
},
|
||||
];
|
||||
|
||||
function QueueStatusFilterBuilderRowValue(props: Readonly<FilterBuilderRowValueProps>) {
|
||||
function QueueStatusFilterBuilderRowValue(
|
||||
props: Readonly<FilterBuilderRowValueProps>
|
||||
) {
|
||||
return <FilterBuilderRowValue {...props} tagList={statusTagList} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,10 @@ import usePrevious from 'Helpers/Hooks/usePrevious';
|
|||
import { InputChanged } from 'typings/inputs';
|
||||
import styles from './AutoSuggestInput.css';
|
||||
|
||||
interface AutoSuggestInputProps<T>
|
||||
extends Omit<AutosuggestPropsBase<T>, 'renderInputComponent' | 'inputProps'> {
|
||||
interface AutoSuggestInputProps<T> extends Omit<
|
||||
AutosuggestPropsBase<T>,
|
||||
'renderInputComponent' | 'inputProps'
|
||||
> {
|
||||
forwardedRef?: MutableRefObject<Autosuggest<T> | null>;
|
||||
className?: string;
|
||||
inputContainerClassName?: string;
|
||||
|
|
|
|||
|
|
@ -90,65 +90,68 @@ const componentMap: Record<InputType, ElementType> = {
|
|||
type PickProps<V, C extends InputType> = C extends 'text'
|
||||
? TextInputProps
|
||||
: C extends 'autoComplete'
|
||||
? AutoCompleteInputProps
|
||||
: C extends 'availabilitySelect'
|
||||
? AvailabilitySelectInputProps
|
||||
: C extends 'captcha'
|
||||
? CaptchaInputProps
|
||||
: C extends 'check'
|
||||
? CheckInputProps
|
||||
: C extends 'date'
|
||||
? TextInputProps
|
||||
: C extends 'device'
|
||||
? DeviceInputProps
|
||||
: C extends 'downloadClientSelect'
|
||||
? DownloadClientSelectInputProps
|
||||
: C extends 'dynamicSelect'
|
||||
? ProviderOptionSelectInputProps
|
||||
: C extends 'file'
|
||||
? TextInputProps
|
||||
: C extends 'float'
|
||||
? TextInputProps
|
||||
: C extends 'indexerFlagsSelect'
|
||||
? IndexerFlagsSelectInputProps
|
||||
: C extends 'indexerSelect'
|
||||
? IndexerSelectInputProps
|
||||
: C extends 'keyValueList'
|
||||
? KeyValueListInputProps
|
||||
: C extends 'languageSelect'
|
||||
? LanguageSelectInputProps
|
||||
: C extends 'monitorMoviesSelect'
|
||||
? MonitorMoviesSelectInputProps
|
||||
: C extends 'movieTag'
|
||||
? MovieTagInputProps<V>
|
||||
: C extends 'number'
|
||||
? NumberInputProps
|
||||
: C extends 'oauth'
|
||||
? OAuthInputProps
|
||||
: C extends 'password'
|
||||
? TextInputProps
|
||||
: C extends 'path'
|
||||
? PathInputProps
|
||||
: C extends 'qualityProfileSelect'
|
||||
? QualityProfileSelectInputProps
|
||||
: C extends 'rootFolderSelect'
|
||||
? RootFolderSelectInputProps
|
||||
: C extends 'select'
|
||||
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
EnhancedSelectInputProps<any, V>
|
||||
: C extends 'tag'
|
||||
? MovieTagInputProps<V>
|
||||
: C extends 'tagSelect'
|
||||
? TagSelectInputProps
|
||||
: C extends 'text'
|
||||
? TextInputProps
|
||||
: C extends 'textArea'
|
||||
? TextAreaProps
|
||||
: C extends 'textTag'
|
||||
? TextTagInputProps
|
||||
: C extends 'umask'
|
||||
? UMaskInputProps
|
||||
: never;
|
||||
? AutoCompleteInputProps
|
||||
: C extends 'availabilitySelect'
|
||||
? AvailabilitySelectInputProps
|
||||
: C extends 'captcha'
|
||||
? CaptchaInputProps
|
||||
: C extends 'check'
|
||||
? CheckInputProps
|
||||
: C extends 'date'
|
||||
? TextInputProps
|
||||
: C extends 'device'
|
||||
? DeviceInputProps
|
||||
: C extends 'downloadClientSelect'
|
||||
? DownloadClientSelectInputProps
|
||||
: C extends 'dynamicSelect'
|
||||
? ProviderOptionSelectInputProps
|
||||
: C extends 'file'
|
||||
? TextInputProps
|
||||
: C extends 'float'
|
||||
? TextInputProps
|
||||
: C extends 'indexerFlagsSelect'
|
||||
? IndexerFlagsSelectInputProps
|
||||
: C extends 'indexerSelect'
|
||||
? IndexerSelectInputProps
|
||||
: C extends 'keyValueList'
|
||||
? KeyValueListInputProps
|
||||
: C extends 'languageSelect'
|
||||
? LanguageSelectInputProps
|
||||
: C extends 'monitorMoviesSelect'
|
||||
? MonitorMoviesSelectInputProps
|
||||
: C extends 'movieTag'
|
||||
? MovieTagInputProps<V>
|
||||
: C extends 'number'
|
||||
? NumberInputProps
|
||||
: C extends 'oauth'
|
||||
? OAuthInputProps
|
||||
: C extends 'password'
|
||||
? TextInputProps
|
||||
: C extends 'path'
|
||||
? PathInputProps
|
||||
: C extends 'qualityProfileSelect'
|
||||
? QualityProfileSelectInputProps
|
||||
: C extends 'rootFolderSelect'
|
||||
? RootFolderSelectInputProps
|
||||
: C extends 'select'
|
||||
? EnhancedSelectInputProps<
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
any,
|
||||
V
|
||||
>
|
||||
: C extends 'tag'
|
||||
? MovieTagInputProps<V>
|
||||
: C extends 'tagSelect'
|
||||
? TagSelectInputProps
|
||||
: C extends 'text'
|
||||
? TextInputProps
|
||||
: C extends 'textArea'
|
||||
? TextAreaProps
|
||||
: C extends 'textTag'
|
||||
? TextTagInputProps
|
||||
: C extends 'umask'
|
||||
? UMaskInputProps
|
||||
: never;
|
||||
|
||||
export interface FormInputGroupValues<T> {
|
||||
key: T;
|
||||
|
|
|
|||
|
|
@ -24,8 +24,10 @@ function parseValue(
|
|||
return newValue;
|
||||
}
|
||||
|
||||
export interface NumberInputProps
|
||||
extends Omit<TextInputProps, 'value' | 'onChange'> {
|
||||
export interface NumberInputProps extends Omit<
|
||||
TextInputProps,
|
||||
'value' | 'onChange'
|
||||
> {
|
||||
value?: number | null;
|
||||
min?: number;
|
||||
max?: number;
|
||||
|
|
|
|||
|
|
@ -5,11 +5,10 @@ import EnhancedSelectInput, {
|
|||
EnhancedSelectInputValue,
|
||||
} from './EnhancedSelectInput';
|
||||
|
||||
export interface AvailabilitySelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'values'
|
||||
> {
|
||||
export interface AvailabilitySelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'values'
|
||||
> {
|
||||
includeNoChange?: boolean;
|
||||
includeNoChangeDisabled?: boolean;
|
||||
includeMixed?: boolean;
|
||||
|
|
@ -42,7 +41,9 @@ const movieAvailabilityOptions: IMovieAvailabilityOption[] = [
|
|||
},
|
||||
];
|
||||
|
||||
function AvailabilitySelectInput(props: Readonly<AvailabilitySelectInputProps>) {
|
||||
function AvailabilitySelectInput(
|
||||
props: Readonly<AvailabilitySelectInputProps>
|
||||
) {
|
||||
const {
|
||||
includeNoChange = false,
|
||||
includeNoChangeDisabled = true,
|
||||
|
|
|
|||
|
|
@ -51,11 +51,10 @@ function createDownloadClientsSelector(
|
|||
);
|
||||
}
|
||||
|
||||
export interface DownloadClientSelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<number>, number>,
|
||||
'values'
|
||||
> {
|
||||
export interface DownloadClientSelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<number>, number>,
|
||||
'values'
|
||||
> {
|
||||
name: string;
|
||||
value: number;
|
||||
includeAny?: boolean;
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ export interface EnhancedSelectInputValue<V> {
|
|||
|
||||
export interface EnhancedSelectInputProps<
|
||||
T extends EnhancedSelectInputValue<V>,
|
||||
V
|
||||
V,
|
||||
> {
|
||||
className?: string;
|
||||
disabledClassName?: string;
|
||||
|
|
|
|||
|
|
@ -5,15 +5,19 @@ import EnhancedSelectInputOption, {
|
|||
} from './EnhancedSelectInputOption';
|
||||
import styles from './HintedSelectInputOption.css';
|
||||
|
||||
interface HintedSelectInputOptionProps
|
||||
extends Omit<EnhancedSelectInputOptionProps, 'isSelected'> {
|
||||
interface HintedSelectInputOptionProps extends Omit<
|
||||
EnhancedSelectInputOptionProps,
|
||||
'isSelected'
|
||||
> {
|
||||
value: string;
|
||||
hint?: React.ReactNode;
|
||||
dividerAfter?: boolean;
|
||||
isSelected?: boolean;
|
||||
}
|
||||
|
||||
function HintedSelectInputOption(props: Readonly<HintedSelectInputOptionProps>) {
|
||||
function HintedSelectInputOption(
|
||||
props: Readonly<HintedSelectInputOptionProps>
|
||||
) {
|
||||
const {
|
||||
id,
|
||||
value,
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ interface HintedSelectInputSelectedValueProps<T, V> {
|
|||
|
||||
function HintedSelectInputSelectedValue<
|
||||
T extends EnhancedSelectInputValue<V>,
|
||||
V extends number | string
|
||||
V extends number | string,
|
||||
>(props: HintedSelectInputSelectedValueProps<T, V>) {
|
||||
const {
|
||||
selectedValue,
|
||||
|
|
|
|||
|
|
@ -6,16 +6,17 @@ import EnhancedSelectInput, {
|
|||
EnhancedSelectInputValue,
|
||||
} from './EnhancedSelectInput';
|
||||
|
||||
export interface MonitorMoviesSelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'values'
|
||||
> {
|
||||
export interface MonitorMoviesSelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'values'
|
||||
> {
|
||||
includeNoChange?: boolean;
|
||||
includeMixed?: boolean;
|
||||
}
|
||||
|
||||
function MonitorMoviesSelectInput(props: Readonly<MonitorMoviesSelectInputProps>) {
|
||||
function MonitorMoviesSelectInput(
|
||||
props: Readonly<MonitorMoviesSelectInputProps>
|
||||
) {
|
||||
const {
|
||||
includeNoChange = false,
|
||||
includeMixed = false,
|
||||
|
|
|
|||
|
|
@ -69,11 +69,10 @@ function createProviderOptionsSelector(
|
|||
);
|
||||
}
|
||||
|
||||
export interface ProviderOptionSelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<unknown>, unknown>,
|
||||
'values'
|
||||
> {
|
||||
export interface ProviderOptionSelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<unknown>, unknown>,
|
||||
'values'
|
||||
> {
|
||||
provider: string;
|
||||
providerData: ProviderOptions;
|
||||
name: string;
|
||||
|
|
|
|||
|
|
@ -56,14 +56,13 @@ function createQualityProfilesSelector(
|
|||
);
|
||||
}
|
||||
|
||||
export interface QualityProfileSelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<
|
||||
EnhancedSelectInputValue<number | string>,
|
||||
number | string
|
||||
>,
|
||||
'values'
|
||||
> {
|
||||
export interface QualityProfileSelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<
|
||||
EnhancedSelectInputValue<number | string>,
|
||||
number | string
|
||||
>,
|
||||
'values'
|
||||
> {
|
||||
name: string;
|
||||
includeNoChange?: boolean;
|
||||
includeNoChangeDisabled?: boolean;
|
||||
|
|
|
|||
|
|
@ -19,17 +19,15 @@ import RootFolderSelectInputSelectedValue from './RootFolderSelectInputSelectedV
|
|||
|
||||
const ADD_NEW_KEY = 'addNew';
|
||||
|
||||
export interface RootFolderSelectInputValue
|
||||
extends EnhancedSelectInputValue<string> {
|
||||
export interface RootFolderSelectInputValue extends EnhancedSelectInputValue<string> {
|
||||
freeSpace?: number;
|
||||
isMissing?: boolean;
|
||||
}
|
||||
|
||||
export interface RootFolderSelectInputProps
|
||||
extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'value' | 'values'
|
||||
> {
|
||||
export interface RootFolderSelectInputProps extends Omit<
|
||||
EnhancedSelectInputProps<EnhancedSelectInputValue<string>, string>,
|
||||
'value' | 'values'
|
||||
> {
|
||||
name: string;
|
||||
value?: string;
|
||||
includeMissingValue?: boolean;
|
||||
|
|
|
|||
|
|
@ -7,8 +7,7 @@ import EnhancedSelectInputOption, {
|
|||
} from './EnhancedSelectInputOption';
|
||||
import styles from './RootFolderSelectInputOption.css';
|
||||
|
||||
interface RootFolderSelectInputOptionProps
|
||||
extends EnhancedSelectInputOptionProps {
|
||||
interface RootFolderSelectInputOptionProps extends EnhancedSelectInputOptionProps {
|
||||
id: string;
|
||||
value: string;
|
||||
freeSpace?: number;
|
||||
|
|
|
|||
|
|
@ -8,8 +8,10 @@ import React, {
|
|||
import { InputChanged } from 'typings/inputs';
|
||||
import styles from './SelectInput.css';
|
||||
|
||||
export interface SelectInputOption
|
||||
extends Pick<ComponentProps<'option'>, 'disabled'> {
|
||||
export interface SelectInputOption extends Pick<
|
||||
ComponentProps<'option'>,
|
||||
'disabled'
|
||||
> {
|
||||
key: string | number;
|
||||
value: string | number | (() => string | number);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,11 +8,10 @@ interface TextTag extends TagBase {
|
|||
name: string;
|
||||
}
|
||||
|
||||
export interface TextTagInputProps
|
||||
extends Omit<
|
||||
TagInputProps<TextTag>,
|
||||
'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete'
|
||||
> {
|
||||
export interface TextTagInputProps extends Omit<
|
||||
TagInputProps<TextTag>,
|
||||
'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete'
|
||||
> {
|
||||
name: string;
|
||||
value: string | string[];
|
||||
onChange: (change: InputChanged<string[]>) => unknown;
|
||||
|
|
|
|||
|
|
@ -11,11 +11,10 @@ import styles from './Icon.css';
|
|||
export type IconName = FontAwesomeIconProps['icon'];
|
||||
export type IconKind = Extract<Kind, keyof typeof styles>;
|
||||
|
||||
export interface IconProps
|
||||
extends Omit<
|
||||
FontAwesomeIconProps,
|
||||
'icon' | 'spin' | 'name' | 'title' | 'size'
|
||||
> {
|
||||
export interface IconProps extends Omit<
|
||||
FontAwesomeIconProps,
|
||||
'icon' | 'spin' | 'name' | 'title' | 'size'
|
||||
> {
|
||||
containerClassName?: ComponentProps<'span'>['className'];
|
||||
name: IconName;
|
||||
kind?: IconKind;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ import Link, { LinkProps } from './Link';
|
|||
import styles from './IconButton.css';
|
||||
|
||||
export interface IconButtonProps
|
||||
extends Omit<LinkProps, 'name' | 'kind'>,
|
||||
extends
|
||||
Omit<LinkProps, 'name' | 'kind'>,
|
||||
Pick<IconProps, 'name' | 'kind' | 'size' | 'isSpinning'> {
|
||||
iconClassName?: IconProps['className'];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,10 @@ function getLabelForMediaType(mediaType?: MediaType) {
|
|||
}
|
||||
}
|
||||
|
||||
function MediaTypeBadge({ mediaType, className }: Readonly<MediaTypeBadgeProps>) {
|
||||
function MediaTypeBadge({
|
||||
mediaType,
|
||||
className,
|
||||
}: Readonly<MediaTypeBadgeProps>) {
|
||||
return (
|
||||
<Label
|
||||
className={className}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import React, { useCallback } from 'react';
|
||||
import SelectedMenuItem, { SelectedMenuItemProps } from './SelectedMenuItem';
|
||||
|
||||
interface FilterMenuItemProps
|
||||
extends Omit<SelectedMenuItemProps, 'isSelected' | 'onPress'> {
|
||||
interface FilterMenuItemProps extends Omit<
|
||||
SelectedMenuItemProps,
|
||||
'isSelected' | 'onPress'
|
||||
> {
|
||||
filterKey: string | number;
|
||||
selectedFilterKey: string | number;
|
||||
onPress: (filter: number | string) => void;
|
||||
|
|
|
|||
|
|
@ -5,8 +5,10 @@ import MenuButton, { MenuButtonProps } from 'Components/Menu/MenuButton';
|
|||
import { icons } from 'Helpers/Props';
|
||||
import styles from './ToolbarMenuButton.css';
|
||||
|
||||
export interface ToolbarMenuButtonProps
|
||||
extends Omit<MenuButtonProps, 'children'> {
|
||||
export interface ToolbarMenuButtonProps extends Omit<
|
||||
MenuButtonProps,
|
||||
'children'
|
||||
> {
|
||||
className?: string;
|
||||
iconName: IconName;
|
||||
showIndicator?: boolean;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,10 @@ interface ModalErrorProps extends ErrorBoundaryErrorProps {
|
|||
onModalClose: () => void;
|
||||
}
|
||||
|
||||
function ModalError({ onModalClose, ...otherProps }: Readonly<ModalErrorProps>) {
|
||||
function ModalError({
|
||||
onModalClose,
|
||||
...otherProps
|
||||
}: Readonly<ModalErrorProps>) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>{translate('Error')}</ModalHeader>
|
||||
|
|
|
|||
|
|
@ -39,18 +39,17 @@ interface AddNewMovieSuggestion {
|
|||
title: string;
|
||||
}
|
||||
|
||||
export interface SuggestedMovie
|
||||
extends Pick<
|
||||
Movie,
|
||||
| 'title'
|
||||
| 'year'
|
||||
| 'titleSlug'
|
||||
| 'sortTitle'
|
||||
| 'images'
|
||||
| 'alternateTitles'
|
||||
| 'tmdbId'
|
||||
| 'imdbId'
|
||||
> {
|
||||
export interface SuggestedMovie extends Pick<
|
||||
Movie,
|
||||
| 'title'
|
||||
| 'year'
|
||||
| 'titleSlug'
|
||||
| 'sortTitle'
|
||||
| 'images'
|
||||
| 'alternateTitles'
|
||||
| 'tmdbId'
|
||||
| 'imdbId'
|
||||
> {
|
||||
firstCharacter: string;
|
||||
tags: Tag[];
|
||||
}
|
||||
|
|
@ -125,7 +124,8 @@ function MovieSearchInput() {
|
|||
const { bindShortcut, unbindShortcut } = useKeyboardShortcuts();
|
||||
|
||||
const [value, setValue] = useState('');
|
||||
const [_requestLoading, setRequestLoading] = useState(false);
|
||||
// eslint-disable-next-line react/hook-use-state
|
||||
const [, setRequestLoading] = useState(false);
|
||||
const [suggestions, setSuggestions] = useState<MovieSuggestion[]>([]);
|
||||
|
||||
const autosuggestRef = useRef<Autosuggest>(null);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,10 @@ export interface PageJumpBarItemProps {
|
|||
onItemPress: (label: string) => void;
|
||||
}
|
||||
|
||||
function PageJumpBarItem({ label, onItemPress }: Readonly<PageJumpBarItemProps>) {
|
||||
function PageJumpBarItem({
|
||||
label,
|
||||
onItemPress,
|
||||
}: Readonly<PageJumpBarItemProps>) {
|
||||
const handlePress = useCallback(() => {
|
||||
onItemPress(label);
|
||||
}, [label, onItemPress]);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,13 @@ interface MessageProps {
|
|||
type: Extract<MessageType, keyof typeof styles>;
|
||||
}
|
||||
|
||||
function Message({ id, hideAfter, name, message, type }: Readonly<MessageProps>) {
|
||||
function Message({
|
||||
id,
|
||||
hideAfter,
|
||||
name,
|
||||
message,
|
||||
type,
|
||||
}: Readonly<MessageProps>) {
|
||||
const dispatch = useDispatch();
|
||||
const dismissTimeout = useRef<ReturnType<typeof setTimeout>>();
|
||||
|
||||
|
|
|
|||
|
|
@ -219,7 +219,10 @@ interface PageSidebarProps {
|
|||
isSidebarVisible: boolean;
|
||||
}
|
||||
|
||||
function PageSidebar({ isSidebarVisible, isSmallScreen }: Readonly<PageSidebarProps>) {
|
||||
function PageSidebar({
|
||||
isSidebarVisible,
|
||||
isSmallScreen,
|
||||
}: Readonly<PageSidebarProps>) {
|
||||
const dispatch = useDispatch();
|
||||
const location = useLocation();
|
||||
const sidebarRef = useRef(null);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,9 @@ interface PageToolbarOverflowMenuItemProps {
|
|||
onPress?: (event: SyntheticEvent<Element, Event>) => void;
|
||||
}
|
||||
|
||||
function PageToolbarOverflowMenuItem(props: Readonly<PageToolbarOverflowMenuItemProps>) {
|
||||
function PageToolbarOverflowMenuItem(
|
||||
props: Readonly<PageToolbarOverflowMenuItemProps>
|
||||
) {
|
||||
const {
|
||||
iconName,
|
||||
spinningName,
|
||||
|
|
|
|||
|
|
@ -13,7 +13,10 @@ interface FavoriteFolderRowProps {
|
|||
onPress: (folder: string) => unknown;
|
||||
}
|
||||
|
||||
function FavoriteFolderRow({ folder, onPress }: Readonly<FavoriteFolderRowProps>) {
|
||||
function FavoriteFolderRow({
|
||||
folder,
|
||||
onPress,
|
||||
}: Readonly<FavoriteFolderRowProps>) {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const handlePress = useCallback(() => {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,9 @@ interface SelectIndexerFlagsModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function SelectIndexerFlagsModal(props: Readonly<SelectIndexerFlagsModalProps>) {
|
||||
function SelectIndexerFlagsModal(
|
||||
props: Readonly<SelectIndexerFlagsModalProps>
|
||||
) {
|
||||
const {
|
||||
isOpen,
|
||||
indexerFlags,
|
||||
|
|
|
|||
|
|
@ -8,8 +8,10 @@ import InteractiveImportModalContent, {
|
|||
InteractiveImportModalContentProps,
|
||||
} from './Interactive/InteractiveImportModalContent';
|
||||
|
||||
interface InteractiveImportModalProps
|
||||
extends Omit<InteractiveImportModalContentProps, 'modalTitle'> {
|
||||
interface InteractiveImportModalProps extends Omit<
|
||||
InteractiveImportModalContentProps,
|
||||
'modalTitle'
|
||||
> {
|
||||
isOpen: boolean;
|
||||
folder?: string;
|
||||
downloadId?: string;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,9 @@ function createFilteredLanguagesSelector() {
|
|||
});
|
||||
}
|
||||
|
||||
function SelectLanguageModalContent(props: Readonly<SelectLanguageModalContentProps>) {
|
||||
function SelectLanguageModalContent(
|
||||
props: Readonly<SelectLanguageModalContentProps>
|
||||
) {
|
||||
const { modalTitle, onLanguagesSelect, onModalClose } = props;
|
||||
|
||||
const { isFetching, isPopulated, error, items } = useSelector(
|
||||
|
|
|
|||
|
|
@ -99,7 +99,9 @@ function Row({ index, style, data }: ListChildComponentProps<RowItemData>) {
|
|||
);
|
||||
}
|
||||
|
||||
function SelectMovieModalContent(props: Readonly<SelectMovieModalContentProps>) {
|
||||
function SelectMovieModalContent(
|
||||
props: Readonly<SelectMovieModalContentProps>
|
||||
) {
|
||||
const { modalTitle, onMovieSelect, onModalClose } = props;
|
||||
|
||||
const listRef = useRef<List<RowItemData>>(null);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,9 @@ interface SelectMovieModalTableHeaderProps {
|
|||
columns: Column[];
|
||||
}
|
||||
|
||||
function SelectMovieModalTableHeader(props: Readonly<SelectMovieModalTableHeaderProps>) {
|
||||
function SelectMovieModalTableHeader(
|
||||
props: Readonly<SelectMovieModalTableHeaderProps>
|
||||
) {
|
||||
const { columns } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -10,7 +10,12 @@ interface SelectMovieRowProps {
|
|||
year: number;
|
||||
}
|
||||
|
||||
function SelectMovieRow({ title, year, tmdbId, imdbId }: Readonly<SelectMovieRowProps>) {
|
||||
function SelectMovieRow({
|
||||
title,
|
||||
year,
|
||||
tmdbId,
|
||||
imdbId,
|
||||
}: Readonly<SelectMovieRowProps>) {
|
||||
return (
|
||||
<>
|
||||
<VirtualTableRowCell className={styles.title}>
|
||||
|
|
|
|||
|
|
@ -56,7 +56,9 @@ interface SelectQualityModalContentProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function SelectQualityModalContent(props: Readonly<SelectQualityModalContentProps>) {
|
||||
function SelectQualityModalContent(
|
||||
props: Readonly<SelectQualityModalContentProps>
|
||||
) {
|
||||
const { modalTitle, onQualitySelect, onModalClose } = props;
|
||||
|
||||
const [qualityId, setQualityId] = useState(props.qualityId);
|
||||
|
|
|
|||
|
|
@ -10,7 +10,9 @@ interface SelectReleaseGroupModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function SelectReleaseGroupModal(props: Readonly<SelectReleaseGroupModalProps>) {
|
||||
function SelectReleaseGroupModal(
|
||||
props: Readonly<SelectReleaseGroupModalProps>
|
||||
) {
|
||||
const {
|
||||
isOpen,
|
||||
releaseGroup,
|
||||
|
|
|
|||
|
|
@ -125,7 +125,9 @@ interface InteractiveSearchProps {
|
|||
searchPayload: InteractiveSearchPayload;
|
||||
}
|
||||
|
||||
function InteractiveSearch({ searchPayload }: Readonly<InteractiveSearchProps>) {
|
||||
function InteractiveSearch({
|
||||
searchPayload,
|
||||
}: Readonly<InteractiveSearchProps>) {
|
||||
const {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@ interface SelectDownloadClientModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function SelectDownloadClientModal(props: Readonly<SelectDownloadClientModalProps>) {
|
||||
function SelectDownloadClientModal(
|
||||
props: Readonly<SelectDownloadClientModalProps>
|
||||
) {
|
||||
const { isOpen, protocol, modalTitle, onDownloadClientSelect, onModalClose } =
|
||||
props;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,9 @@ interface OverrideMatchModalContentProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function OverrideMatchModalContent(props: Readonly<OverrideMatchModalContentProps>) {
|
||||
function OverrideMatchModalContent(
|
||||
props: Readonly<OverrideMatchModalContentProps>
|
||||
) {
|
||||
const modalTitle = translate('ManualGrab');
|
||||
const {
|
||||
indexerId,
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ import MovieCredit from 'typings/MovieCredit';
|
|||
import translate from 'Utilities/String/translate';
|
||||
import styles from '../MovieCreditPoster.css';
|
||||
|
||||
export interface MovieCastPosterProps
|
||||
extends Pick<MovieCredit, 'personName' | 'images' | 'character'> {
|
||||
export interface MovieCastPosterProps extends Pick<
|
||||
MovieCredit,
|
||||
'personName' | 'images' | 'character'
|
||||
> {
|
||||
tmdbId: number;
|
||||
posterWidth: number;
|
||||
posterHeight: number;
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ import MovieCredit from 'typings/MovieCredit';
|
|||
import translate from 'Utilities/String/translate';
|
||||
import styles from '../MovieCreditPoster.css';
|
||||
|
||||
export interface MovieCrewPosterProps
|
||||
extends Pick<MovieCredit, 'personName' | 'images' | 'job'> {
|
||||
export interface MovieCrewPosterProps extends Pick<
|
||||
MovieCredit,
|
||||
'personName' | 'images' | 'job'
|
||||
> {
|
||||
tmdbId: number;
|
||||
posterWidth: number;
|
||||
posterHeight: number;
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@ interface MovieIndexSearchMenuItemProps {
|
|||
selectedFilterKey: string;
|
||||
}
|
||||
|
||||
function MovieIndexSearchMenuItem(props: Readonly<MovieIndexSearchMenuItemProps>) {
|
||||
function MovieIndexSearchMenuItem(
|
||||
props: Readonly<MovieIndexSearchMenuItemProps>
|
||||
) {
|
||||
const isSearching = useSelector(createCommandExecutingSelector(MOVIE_SEARCH));
|
||||
const {
|
||||
items,
|
||||
|
|
|
|||
|
|
@ -41,7 +41,9 @@ interface MovieIndexOverviewInfoProps {
|
|||
sortKey: string;
|
||||
}
|
||||
|
||||
const infoRowHeight = Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight);
|
||||
const infoRowHeight = Number.parseInt(
|
||||
dimensions.movieIndexOverviewInfoRowHeight
|
||||
);
|
||||
|
||||
const rows = [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,9 @@ interface MovieIndexOverviewInfoRowProps {
|
|||
label: string;
|
||||
}
|
||||
|
||||
function MovieIndexOverviewInfoRow(props: Readonly<MovieIndexOverviewInfoRowProps>) {
|
||||
function MovieIndexOverviewInfoRow(
|
||||
props: Readonly<MovieIndexOverviewInfoRowProps>
|
||||
) {
|
||||
const { title, iconName, label } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -15,7 +15,9 @@ const columnPaddingSmallScreen = Number.parseInt(
|
|||
dimensions.movieIndexColumnPaddingSmallScreen
|
||||
);
|
||||
const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight);
|
||||
const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight);
|
||||
const detailedProgressBarHeight = Number.parseInt(
|
||||
dimensions.progressBarMediumHeight
|
||||
);
|
||||
const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding);
|
||||
const bodyPaddingSmallScreen = Number.parseInt(
|
||||
dimensions.pageContentBodyPaddingSmallScreen
|
||||
|
|
|
|||
|
|
@ -20,7 +20,9 @@ const columnPaddingSmallScreen = Number.parseInt(
|
|||
dimensions.movieIndexColumnPaddingSmallScreen
|
||||
);
|
||||
const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight);
|
||||
const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight);
|
||||
const detailedProgressBarHeight = Number.parseInt(
|
||||
dimensions.progressBarMediumHeight
|
||||
);
|
||||
|
||||
const ADDITIONAL_COLUMN_COUNT: Record<string, number> = {
|
||||
small: 3,
|
||||
|
|
@ -100,7 +102,9 @@ function getWindowScrollTopPosition() {
|
|||
return document.documentElement.scrollTop || document.body.scrollTop || 0;
|
||||
}
|
||||
|
||||
export default function MovieIndexPosters(props: Readonly<MovieIndexPostersProps>) {
|
||||
export default function MovieIndexPosters(
|
||||
props: Readonly<MovieIndexPostersProps>
|
||||
) {
|
||||
const {
|
||||
scrollerRef,
|
||||
items,
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@ function PosterDateRow({
|
|||
}
|
||||
|
||||
return (
|
||||
<div className={styles.title} title={`${label}: ${formatDate(date, longDateFormat)}`}>
|
||||
<div
|
||||
className={styles.title}
|
||||
title={`${label}: ${formatDate(date, longDateFormat)}`}
|
||||
>
|
||||
<Icon name={icon} />{' '}
|
||||
{getRelativeDate({
|
||||
date,
|
||||
|
|
|
|||
|
|
@ -30,7 +30,9 @@ const selectDeleteOptions = createSelector(
|
|||
(deleteOptions) => deleteOptions
|
||||
);
|
||||
|
||||
function DeleteMovieModalContent(props: Readonly<DeleteMovieModalContentProps>) {
|
||||
function DeleteMovieModalContent(
|
||||
props: Readonly<DeleteMovieModalContentProps>
|
||||
) {
|
||||
const { movieIds, onModalClose } = props;
|
||||
|
||||
const { addImportExclusion } = useSelector(selectDeleteOptions);
|
||||
|
|
|
|||
|
|
@ -6,12 +6,16 @@ import PageToolbarButton, {
|
|||
import { icons } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
interface MovieIndexSelectAllButtonProps
|
||||
extends Omit<PageToolbarButtonProps, 'iconName'> {
|
||||
interface MovieIndexSelectAllButtonProps extends Omit<
|
||||
PageToolbarButtonProps,
|
||||
'iconName'
|
||||
> {
|
||||
isSelectMode: boolean;
|
||||
}
|
||||
|
||||
function MovieIndexSelectAllButton(props: Readonly<MovieIndexSelectAllButtonProps>) {
|
||||
function MovieIndexSelectAllButton(
|
||||
props: Readonly<MovieIndexSelectAllButtonProps>
|
||||
) {
|
||||
const { isSelectMode, overflowComponent } = props;
|
||||
const [selectState, selectDispatch] = useSelect();
|
||||
const { allSelected, allUnselected } = selectState;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,9 @@ interface MovieIndexSelectAllMenuItemProps {
|
|||
isSelectMode: boolean;
|
||||
}
|
||||
|
||||
function MovieIndexSelectAllMenuItem(props: Readonly<MovieIndexSelectAllMenuItemProps>) {
|
||||
function MovieIndexSelectAllMenuItem(
|
||||
props: Readonly<MovieIndexSelectAllMenuItemProps>
|
||||
) {
|
||||
const { isSelectMode } = props;
|
||||
const [selectState, selectDispatch] = useSelect();
|
||||
const { allSelected, allUnselected } = selectState;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ interface MovieIndexSelectModeButtonProps extends PageToolbarButtonProps {
|
|||
onPress: () => void;
|
||||
}
|
||||
|
||||
function MovieIndexSelectModeButton(props: Readonly<MovieIndexSelectModeButtonProps>) {
|
||||
function MovieIndexSelectModeButton(
|
||||
props: Readonly<MovieIndexSelectModeButtonProps>
|
||||
) {
|
||||
const { label, iconName, isSelectMode, overflowComponent, onPress } = props;
|
||||
const [, selectDispatch] = useSelect();
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,9 @@ interface OrganizeMoviesModalContentProps {
|
|||
onModalClose: () => void;
|
||||
}
|
||||
|
||||
function OrganizeMoviesModalContent(props: Readonly<OrganizeMoviesModalContentProps>) {
|
||||
function OrganizeMoviesModalContent(
|
||||
props: Readonly<OrganizeMoviesModalContentProps>
|
||||
) {
|
||||
const { movieIds, onModalClose } = props;
|
||||
|
||||
const allMovies: Movie[] = useSelector(createAllMoviesSelector());
|
||||
|
|
|
|||
|
|
@ -4,12 +4,17 @@ import MovieImage, { MovieImageProps } from './MovieImage';
|
|||
const posterPlaceholder =
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAD3CAMAAAC+Te+kAAAAZlBMVEUvLi8vLy8vLzAvMDAwLy8wLzAwMDAwMDEwMTExMDAxMDExMTExMTIxMjIyMjIyMjMyMzMzMjMzMzMzMzQzNDQ0NDQ0NDU0NTU1NTU1NTY1NjY2NTY2NjY2Njc2Nzc3Njc3Nzc3NziHChLWAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MKCgEdHeShUbsAAALZSURBVHja7dxNcuwgDEZR1qAVmP1vMrNUJe91GfTzCSpXo575lAymjYWGXRIDKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKNA/AZ3fcTR0/owjofNDnAadnwPoPnS+xTXQeQZ0rkQ/dC4H0Gzo7ITO3bgGOnug/2PcAF3Mczt0fUj0QncG7znQBupw3PkWqh8qpkagpnyqjuArkkxaC02kRqGypCZANVYFdJZCdy9WTRVB5znQ6qTmjFFBWnOhdg20Lqnp0CpqAbRmAJRAK5JaA32zngTNvv910OSkVkJTs1oLtWugeTkNQZ/nkT2rotBHldUwNE6VQTVWGTQ6AHKggqGaBS23JkKf0hUgE1qa01Ro5fzPhoapR0HtCGg4q0poSCqFRgaAFhqxqqEr1EOgmdJaqHdaHQq1I6CunPZAHdY2aIJUBN2V9kE3H1Wd0BXrNVA7BLpgdUCtALo8pZqhdgd0Z6OyE7q1pdoH3dv7tS7o7iZ1E3R/N70Huuz795cQao65vvkqooT+vEgDdPcbj2s3zxTv9Qt/7cuhdgfUo2yAOplyqNuphfqZSqhFmEJo0HkcdPZCo0rRymRxpwSawHR+YtyBZihfvi+nQO0OqCmcYahGqYPGS4qCUJkzBpUpJdCkordyaFZxXi1UUpaZAJ2XQFOLh8ug2XXjVdD0+vYiqLIO3w1VH8EogtoxUPnpGxe04zyTA1p57i4T2nTmbnnnUuLMg1afYE2C1h+1zYEKjlknQLtPg9tb3YzU+dL054qOBb8cvcz3DlqBZhUmhdrnKo9j+pR0rkN5UHkznZHPtJIYN2TTCe1poTUyk9nWPO0bt8Ys7Ug34mlUMONtPUXMaEdXnXN1MnUzN2Z9q3Lr8XQN1DaLQJpXpiamZwltYdIUHShQoECBAgUKFChQoECBAgUKFChQoECBAgUKFChQoECBAgUKFCjQ+vgCff/mEp/vtiIAAAAASUVORK5CYII=';
|
||||
|
||||
interface MovieHeadshotProps
|
||||
extends Omit<MovieImageProps, 'coverType' | 'placeholder'> {
|
||||
interface MovieHeadshotProps extends Omit<
|
||||
MovieImageProps,
|
||||
'coverType' | 'placeholder'
|
||||
> {
|
||||
size?: 250 | 500;
|
||||
}
|
||||
|
||||
function MovieHeadshot({ size = 250, ...otherProps }: Readonly<MovieHeadshotProps>) {
|
||||
function MovieHeadshot({
|
||||
size = 250,
|
||||
...otherProps
|
||||
}: Readonly<MovieHeadshotProps>) {
|
||||
return (
|
||||
<MovieImage
|
||||
{...otherProps}
|
||||
|
|
|
|||
|
|
@ -4,12 +4,17 @@ import MovieImage, { MovieImageProps } from './MovieImage';
|
|||
const posterPlaceholder =
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAD3CAMAAAC+Te+kAAAAZlBMVEUvLi8vLy8vLzAvMDAwLy8wLzAwMDAwMDEwMTExMDAxMDExMTExMTIxMjIyMjIyMjMyMzMzMjMzMzMzMzQzNDQ0NDQ0NDU0NTU1NTU1NTY1NjY2NTY2NjY2Njc2Nzc3Njc3Nzc3NziHChLWAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+MKCgEdHeShUbsAAALZSURBVHja7dxNcuwgDEZR1qAVmP1vMrNUJe91GfTzCSpXo575lAymjYWGXRIDKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKFCgQIECBQoUKNA/AZ3fcTR0/owjofNDnAadnwPoPnS+xTXQeQZ0rkQ/dC4H0Gzo7ITO3bgGOnug/2PcAF3Mczt0fUj0QncG7znQBupw3PkWqh8qpkagpnyqjuArkkxaC02kRqGypCZANVYFdJZCdy9WTRVB5znQ6qTmjFFBWnOhdg20Lqnp0CpqAbRmAJRAK5JaA32zngTNvv910OSkVkJTs1oLtWugeTkNQZ/nkT2rotBHldUwNE6VQTVWGTQ6AHKggqGaBS23JkKf0hUgE1qa01Ro5fzPhoapR0HtCGg4q0poSCqFRgaAFhqxqqEr1EOgmdJaqHdaHQq1I6CunPZAHdY2aIJUBN2V9kE3H1Wd0BXrNVA7BLpgdUCtALo8pZqhdgd0Z6OyE7q1pdoH3dv7tS7o7iZ1E3R/N70Huuz795cQao65vvkqooT+vEgDdPcbj2s3zxTv9Qt/7cuhdgfUo2yAOplyqNuphfqZSqhFmEJo0HkcdPZCo0rRymRxpwSawHR+YtyBZihfvi+nQO0OqCmcYahGqYPGS4qCUJkzBpUpJdCkordyaFZxXi1UUpaZAJ2XQFOLh8ug2XXjVdD0+vYiqLIO3w1VH8EogtoxUPnpGxe04zyTA1p57i4T2nTmbnnnUuLMg1afYE2C1h+1zYEKjlknQLtPg9tb3YzU+dL054qOBb8cvcz3DlqBZhUmhdrnKo9j+pR0rkN5UHkznZHPtJIYN2TTCe1poTUyk9nWPO0bt8Ys7Ug34mlUMONtPUXMaEdXnXN1MnUzN2Z9q3Lr8XQN1DaLQJpXpiamZwltYdIUHShQoECBAgUKFChQoECBAgUKFChQoECBAgUKFChQoECBAgUKFCjQ+vgCff/mEp/vtiIAAAAASUVORK5CYII=';
|
||||
|
||||
interface MoviePosterProps
|
||||
extends Omit<MovieImageProps, 'coverType' | 'placeholder'> {
|
||||
interface MoviePosterProps extends Omit<
|
||||
MovieImageProps,
|
||||
'coverType' | 'placeholder'
|
||||
> {
|
||||
size?: 250 | 500;
|
||||
}
|
||||
|
||||
function MoviePoster({ size = 250, ...otherProps }: Readonly<MoviePosterProps>) {
|
||||
function MoviePoster({
|
||||
size = 250,
|
||||
...otherProps
|
||||
}: Readonly<MoviePosterProps>) {
|
||||
return (
|
||||
<MovieImage
|
||||
{...otherProps}
|
||||
|
|
|
|||
|
|
@ -12,8 +12,7 @@ import MovieInteractiveSearchModalContent, {
|
|||
MovieInteractiveSearchModalContentProps,
|
||||
} from './MovieInteractiveSearchModalContent';
|
||||
|
||||
interface MovieInteractiveSearchModalProps
|
||||
extends MovieInteractiveSearchModalContentProps {
|
||||
interface MovieInteractiveSearchModalProps extends MovieInteractiveSearchModalContentProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,9 @@ interface ExtraFileDetailsPopoverProps {
|
|||
languageTags?: string[];
|
||||
}
|
||||
|
||||
function ExtraFileDetailsPopover(props: Readonly<ExtraFileDetailsPopoverProps>) {
|
||||
function ExtraFileDetailsPopover(
|
||||
props: Readonly<ExtraFileDetailsPopoverProps>
|
||||
) {
|
||||
const { type, title, languageTags = [] } = props;
|
||||
|
||||
const details = [];
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ interface MovieFileLanguagesProps {
|
|||
movieFileId: number;
|
||||
}
|
||||
|
||||
function MovieFileLanguages({ movieFileId }: Readonly<MovieFileLanguagesProps>) {
|
||||
function MovieFileLanguages({
|
||||
movieFileId,
|
||||
}: Readonly<MovieFileLanguagesProps>) {
|
||||
const movieFile = useMovieFile(movieFileId);
|
||||
|
||||
return <MovieLanguages languages={movieFile?.languages ?? []} />;
|
||||
|
|
|
|||
|
|
@ -13,7 +13,9 @@ interface AdvancedSettingsButtonProps {
|
|||
showLabel: boolean;
|
||||
}
|
||||
|
||||
function AdvancedSettingsButton({ showLabel }: Readonly<AdvancedSettingsButtonProps>) {
|
||||
function AdvancedSettingsButton({
|
||||
showLabel,
|
||||
}: Readonly<AdvancedSettingsButtonProps>) {
|
||||
const showAdvancedSettings = useSelector(
|
||||
(state: AppState) => state.settings.advancedSettings
|
||||
);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ interface ManageCustomFormatsModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function ManageCustomFormatsModal(props: Readonly<ManageCustomFormatsModalProps>) {
|
||||
function ManageCustomFormatsModal(
|
||||
props: Readonly<ManageCustomFormatsModalProps>
|
||||
) {
|
||||
const { isOpen, onModalClose } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -33,7 +33,9 @@ function isDeletingSelector() {
|
|||
);
|
||||
}
|
||||
|
||||
function ManageCustomFormatsModalRow(props: Readonly<ManageCustomFormatsModalRowProps>) {
|
||||
function ManageCustomFormatsModalRow(
|
||||
props: Readonly<ManageCustomFormatsModalRowProps>
|
||||
) {
|
||||
const {
|
||||
id,
|
||||
isSelected,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ interface ManageDownloadClientsModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function ManageDownloadClientsModal(props: Readonly<ManageDownloadClientsModalProps>) {
|
||||
function ManageDownloadClientsModal(
|
||||
props: Readonly<ManageDownloadClientsModalProps>
|
||||
) {
|
||||
const { isOpen, onModalClose } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -3,8 +3,10 @@ import { useDispatch } from 'react-redux';
|
|||
import MenuItem, { MenuItemProps } from 'Components/Menu/MenuItem';
|
||||
import { selectImportListSchema } from 'Store/Actions/settingsActions';
|
||||
|
||||
interface AddImportListPresetMenuItemProps
|
||||
extends Omit<MenuItemProps, 'children'> {
|
||||
interface AddImportListPresetMenuItemProps extends Omit<
|
||||
MenuItemProps,
|
||||
'children'
|
||||
> {
|
||||
name: string;
|
||||
implementation: string;
|
||||
implementationName: string;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ interface ManageImportListsEditModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function ManageImportListsEditModal(props: Readonly<ManageImportListsEditModalProps>) {
|
||||
function ManageImportListsEditModal(
|
||||
props: Readonly<ManageImportListsEditModalProps>
|
||||
) {
|
||||
const { isOpen, importListIds, onSavePress, onModalClose } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -26,7 +26,9 @@ interface ManageImportListsModalRowProps {
|
|||
onSelectedChange(result: SelectStateInputProps): void;
|
||||
}
|
||||
|
||||
function ManageImportListsModalRow(props: Readonly<ManageImportListsModalRowProps>) {
|
||||
function ManageImportListsModalRow(
|
||||
props: Readonly<ManageImportListsModalRowProps>
|
||||
) {
|
||||
const {
|
||||
id,
|
||||
isSelected,
|
||||
|
|
|
|||
|
|
@ -3,8 +3,10 @@ import { useDispatch } from 'react-redux';
|
|||
import MenuItem, { MenuItemProps } from 'Components/Menu/MenuItem';
|
||||
import { selectIndexerSchema } from 'Store/Actions/settingsActions';
|
||||
|
||||
interface AddIndexerPresetMenuItemProps
|
||||
extends Omit<MenuItemProps, 'children'> {
|
||||
interface AddIndexerPresetMenuItemProps extends Omit<
|
||||
MenuItemProps,
|
||||
'children'
|
||||
> {
|
||||
name: string;
|
||||
implementation: string;
|
||||
implementationName: string;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ interface ManageIndexersEditModalProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function ManageIndexersEditModal(props: Readonly<ManageIndexersEditModalProps>) {
|
||||
function ManageIndexersEditModal(
|
||||
props: Readonly<ManageIndexersEditModalProps>
|
||||
) {
|
||||
const { isOpen, indexerIds, onSavePress, onModalClose } = props;
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -84,7 +84,9 @@ interface ManageIndexersModalContentProps {
|
|||
onModalClose(): void;
|
||||
}
|
||||
|
||||
function ManageIndexersModalContent(props: Readonly<ManageIndexersModalContentProps>) {
|
||||
function ManageIndexersModalContent(
|
||||
props: Readonly<ManageIndexersModalContentProps>
|
||||
) {
|
||||
const { onModalClose } = props;
|
||||
|
||||
const {
|
||||
|
|
|
|||
|
|
@ -8,8 +8,10 @@ import EditMetadataModalContent, {
|
|||
EditMetadataModalContentProps,
|
||||
} from './EditMetadataModalContent';
|
||||
|
||||
interface EditMetadataModalProps
|
||||
extends Omit<EditMetadataModalContentProps, 'advancedSettings'> {
|
||||
interface EditMetadataModalProps extends Omit<
|
||||
EditMetadataModalContentProps,
|
||||
'advancedSettings'
|
||||
> {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ interface QualityProfileNameProps {
|
|||
qualityProfileId: number;
|
||||
}
|
||||
|
||||
function QualityProfileName({ qualityProfileId }: Readonly<QualityProfileNameProps>) {
|
||||
function QualityProfileName({
|
||||
qualityProfileId,
|
||||
}: Readonly<QualityProfileNameProps>) {
|
||||
const qualityProfile = useSelector(
|
||||
createQualityProfileSelectorForHook(qualityProfileId)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -7,8 +7,7 @@ import EditSpecificationModalContent, {
|
|||
EditSpecificationModalContentProps,
|
||||
} from './EditSpecificationModalContent';
|
||||
|
||||
interface EditSpecificationModalProps
|
||||
extends EditSpecificationModalContentProps {
|
||||
interface EditSpecificationModalProps extends EditSpecificationModalContentProps {
|
||||
isOpen: boolean;
|
||||
onModalClose: () => void;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,11 @@ interface TagInUseProps {
|
|||
count: number;
|
||||
}
|
||||
|
||||
export default function TagInUse({ label, labelPlural, count }: Readonly<TagInUseProps>) {
|
||||
export default function TagInUse({
|
||||
label,
|
||||
labelPlural,
|
||||
count,
|
||||
}: Readonly<TagInUseProps>) {
|
||||
if (count === 0) {
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue