diff --git a/frontend/src/App/Router.tsx b/frontend/src/App/Router.tsx
index 772311da2..ee520445a 100644
--- a/frontend/src/App/Router.tsx
+++ b/frontend/src/App/Router.tsx
@@ -3,9 +3,8 @@ import { Redirect, Route, Switch, useHistory } from "react-router-dom";
import { useDidMount } from "rooks";
import { useIsRadarrEnabled, useIsSonarrEnabled } from "../@redux/hooks/site";
import BlacklistRouter from "../Blacklist/Router";
+import DisplayItemRouter from "../DisplayItem/Router";
import HistoryRouter from "../History/Router";
-import MovieRouter from "../Movies/Router";
-import SeriesRouter from "../Series/Router";
import SettingRouter from "../Settings/Router";
import EmptyPage, { RouterEmptyPath } from "../special-pages/404";
import SystemRouter from "../System/Router";
@@ -40,16 +39,9 @@ const Router: FunctionComponent<{ className?: string }> = ({ className }) => {
- {sonarr && (
-
-
-
- )}
- {radarr && (
-
-
-
- )}
+
+
+
diff --git a/frontend/src/Series/Episodes/components.tsx b/frontend/src/DisplayItem/Episodes/components.tsx
similarity index 100%
rename from frontend/src/Series/Episodes/components.tsx
rename to frontend/src/DisplayItem/Episodes/components.tsx
diff --git a/frontend/src/Series/Episodes/index.tsx b/frontend/src/DisplayItem/Episodes/index.tsx
similarity index 98%
rename from frontend/src/Series/Episodes/index.tsx
rename to frontend/src/DisplayItem/Episodes/index.tsx
index 3e9ae4bfa..2938fa7a8 100644
--- a/frontend/src/Series/Episodes/index.tsx
+++ b/frontend/src/DisplayItem/Episodes/index.tsx
@@ -23,9 +23,9 @@ import {
SeriesUploadModal,
useShowModal,
} from "../../components";
-import ItemOverview from "../../generic/ItemOverview";
import { RouterEmptyPath } from "../../special-pages/404";
import { useOnLoadedOnce } from "../../utilites";
+import ItemOverview from "../generic/ItemOverview";
import Table from "./table";
interface Params {
diff --git a/frontend/src/Series/Episodes/table.tsx b/frontend/src/DisplayItem/Episodes/table.tsx
similarity index 100%
rename from frontend/src/Series/Episodes/table.tsx
rename to frontend/src/DisplayItem/Episodes/table.tsx
diff --git a/frontend/src/Movies/Detail/index.tsx b/frontend/src/DisplayItem/MovieDetail/index.tsx
similarity index 99%
rename from frontend/src/Movies/Detail/index.tsx
rename to frontend/src/DisplayItem/MovieDetail/index.tsx
index 9c6ff0445..a375953e7 100644
--- a/frontend/src/Movies/Detail/index.tsx
+++ b/frontend/src/DisplayItem/MovieDetail/index.tsx
@@ -26,9 +26,9 @@ import {
useShowModal,
} from "../../components";
import { ManualSearchModal } from "../../components/modals/ManualSearchModal";
-import ItemOverview from "../../generic/ItemOverview";
import { RouterEmptyPath } from "../../special-pages/404";
import { useOnLoadedOnce } from "../../utilites";
+import ItemOverview from "../generic/ItemOverview";
import Table from "./table";
const download = (item: Item.Movie, result: SearchResultType) => {
diff --git a/frontend/src/Movies/Detail/table.tsx b/frontend/src/DisplayItem/MovieDetail/table.tsx
similarity index 100%
rename from frontend/src/Movies/Detail/table.tsx
rename to frontend/src/DisplayItem/MovieDetail/table.tsx
diff --git a/frontend/src/Movies/index.tsx b/frontend/src/DisplayItem/Movies/index.tsx
similarity index 90%
rename from frontend/src/Movies/index.tsx
rename to frontend/src/DisplayItem/Movies/index.tsx
index 9b274b376..d9c2fbe1f 100644
--- a/frontend/src/Movies/index.tsx
+++ b/frontend/src/DisplayItem/Movies/index.tsx
@@ -5,13 +5,13 @@ import React, { FunctionComponent, useMemo } from "react";
import { Badge } from "react-bootstrap";
import { Link } from "react-router-dom";
import { Column } from "react-table";
-import { movieUpdateAll, movieUpdateByRange } from "../@redux/actions";
-import { useMovieEntities } from "../@redux/hooks";
-import { useReduxAction } from "../@redux/hooks/base";
-import { MoviesApi } from "../apis";
-import { ActionBadge, LanguageText, TextPopover } from "../components";
+import { movieUpdateAll, movieUpdateByRange } from "../../@redux/actions";
+import { useMovieEntities } from "../../@redux/hooks";
+import { useReduxAction } from "../../@redux/hooks/base";
+import { MoviesApi } from "../../apis";
+import { ActionBadge, LanguageText, TextPopover } from "../../components";
+import { BuildKey } from "../../utilites";
import BaseItemView from "../generic/BaseItemView";
-import { BuildKey } from "../utilites";
interface Props {}
diff --git a/frontend/src/DisplayItem/Router.tsx b/frontend/src/DisplayItem/Router.tsx
new file mode 100644
index 000000000..1ab2c4f8a
--- /dev/null
+++ b/frontend/src/DisplayItem/Router.tsx
@@ -0,0 +1,45 @@
+import React, { FunctionComponent } from "react";
+import { Redirect, Route, Switch } from "react-router-dom";
+import { useIsRadarrEnabled, useIsSonarrEnabled } from "../@redux/hooks";
+import { RouterEmptyPath } from "../special-pages/404";
+import Episodes from "./Episodes";
+import MovieDetail from "./MovieDetail";
+import Movies from "./Movies";
+import Series from "./Series";
+
+interface Props {}
+
+const Router: FunctionComponent = () => {
+ const radarr = useIsRadarrEnabled();
+ const sonarr = useIsSonarrEnabled();
+
+ return (
+
+ {radarr && (
+
+
+
+ )}
+ {radarr && (
+
+
+
+ )}
+ {sonarr && (
+
+
+
+ )}
+ {sonarr && (
+
+
+
+ )}
+
+
+
+
+ );
+};
+
+export default Router;
diff --git a/frontend/src/Series/index.tsx b/frontend/src/DisplayItem/Series/index.tsx
similarity index 91%
rename from frontend/src/Series/index.tsx
rename to frontend/src/DisplayItem/Series/index.tsx
index 4be74bc5a..81f37c021 100644
--- a/frontend/src/Series/index.tsx
+++ b/frontend/src/DisplayItem/Series/index.tsx
@@ -3,13 +3,13 @@ import React, { FunctionComponent, useMemo } from "react";
import { Badge, ProgressBar } from "react-bootstrap";
import { Link } from "react-router-dom";
import { Column } from "react-table";
-import { seriesUpdateAll, seriesUpdateByRange } from "../@redux/actions";
-import { useSerieEntities } from "../@redux/hooks";
-import { useReduxAction } from "../@redux/hooks/base";
-import { SeriesApi } from "../apis";
-import { ActionBadge } from "../components";
+import { seriesUpdateAll, seriesUpdateByRange } from "../../@redux/actions";
+import { useSerieEntities } from "../../@redux/hooks";
+import { useReduxAction } from "../../@redux/hooks/base";
+import { SeriesApi } from "../../apis";
+import { ActionBadge } from "../../components";
+import { BuildKey } from "../../utilites";
import BaseItemView from "../generic/BaseItemView";
-import { BuildKey } from "../utilites";
interface Props {}
diff --git a/frontend/src/generic/BaseItemView/index.tsx b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx
similarity index 94%
rename from frontend/src/generic/BaseItemView/index.tsx
rename to frontend/src/DisplayItem/generic/BaseItemView/index.tsx
index cc060d4a8..4925089a6 100644
--- a/frontend/src/generic/BaseItemView/index.tsx
+++ b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx
@@ -5,11 +5,11 @@ import React, { useCallback, useMemo, useState } from "react";
import { Container, Dropdown, Row } from "react-bootstrap";
import { Helmet } from "react-helmet";
import { Column } from "react-table";
-import { useIsAnyTaskRunning } from "../../@modules/task/hooks";
-import { useLanguageProfiles } from "../../@redux/hooks";
-import { useAppDispatch } from "../../@redux/hooks/base";
-import { ContentHeader } from "../../components";
-import { GetItemId, isNonNullable } from "../../utilites";
+import { useIsAnyTaskRunning } from "../../../@modules/task/hooks";
+import { useLanguageProfiles } from "../../../@redux/hooks";
+import { useAppDispatch } from "../../../@redux/hooks/base";
+import { ContentHeader } from "../../../components";
+import { GetItemId, isNonNullable } from "../../../utilites";
import Table from "./table";
export interface SharedProps {
diff --git a/frontend/src/generic/BaseItemView/table.tsx b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx
similarity index 85%
rename from frontend/src/generic/BaseItemView/table.tsx
rename to frontend/src/DisplayItem/generic/BaseItemView/table.tsx
index 708515bdc..72c9f234b 100644
--- a/frontend/src/generic/BaseItemView/table.tsx
+++ b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx
@@ -2,16 +2,16 @@ import { uniqBy } from "lodash";
import React, { useCallback, useMemo } from "react";
import { TableOptions, TableUpdater, useRowSelect } from "react-table";
import { SharedProps } from ".";
-import { useLanguageProfiles } from "../../@redux/hooks";
+import { useLanguageProfiles } from "../../../@redux/hooks";
import {
AsyncPageTable,
ItemEditorModal,
SimpleTable,
useShowModal,
-} from "../../components";
-import { TableStyleProps } from "../../components/tables/BaseTable";
-import { useCustomSelection } from "../../components/tables/plugins";
-import { GetItemId, useEntityToList } from "../../utilites";
+} from "../../../components";
+import { TableStyleProps } from "../../../components/tables/BaseTable";
+import { useCustomSelection } from "../../../components/tables/plugins";
+import { GetItemId, useEntityToList } from "../../../utilites";
interface Props extends SharedProps {
dirtyItems: readonly T[];
diff --git a/frontend/src/generic/ItemOverview.tsx b/frontend/src/DisplayItem/generic/ItemOverview.tsx
similarity index 96%
rename from frontend/src/generic/ItemOverview.tsx
rename to frontend/src/DisplayItem/generic/ItemOverview.tsx
index 17d779c28..17c9db188 100644
--- a/frontend/src/generic/ItemOverview.tsx
+++ b/frontend/src/DisplayItem/generic/ItemOverview.tsx
@@ -22,9 +22,9 @@ import {
Popover,
Row,
} from "react-bootstrap";
-import { useProfileBy, useProfileItemsToLanguages } from "../@redux/hooks";
-import { LanguageText } from "../components";
-import { BuildKey, isMovie } from "../utilites";
+import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks";
+import { LanguageText } from "../../components";
+import { BuildKey, isMovie } from "../../utilites";
interface Props {
item: Item.Base;
diff --git a/frontend/src/generic/blacklist.tsx b/frontend/src/DisplayItem/generic/blacklist.tsx
similarity index 95%
rename from frontend/src/generic/blacklist.tsx
rename to frontend/src/DisplayItem/generic/blacklist.tsx
index df33e3efe..6d39f55ae 100644
--- a/frontend/src/generic/blacklist.tsx
+++ b/frontend/src/DisplayItem/generic/blacklist.tsx
@@ -1,7 +1,7 @@
import { faFileExcel } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import React, { FunctionComponent } from "react";
-import { AsyncButton } from "../components";
+import { AsyncButton } from "../../components";
interface Props {
history: History.Base;
diff --git a/frontend/src/History/Movies/index.tsx b/frontend/src/History/Movies/index.tsx
index 9a387ecae..6523e5f1c 100644
--- a/frontend/src/History/Movies/index.tsx
+++ b/frontend/src/History/Movies/index.tsx
@@ -9,7 +9,7 @@ import { useMoviesHistory } from "../../@redux/hooks";
import { useReduxAction } from "../../@redux/hooks/base";
import { MoviesApi } from "../../apis";
import { HistoryIcon, LanguageText, TextPopover } from "../../components";
-import { BlacklistButton } from "../../generic/blacklist";
+import { BlacklistButton } from "../../DisplayItem/generic/blacklist";
import HistoryGenericView from "../generic";
interface Props {}
diff --git a/frontend/src/History/Series/index.tsx b/frontend/src/History/Series/index.tsx
index e96c3e689..ab051fc2b 100644
--- a/frontend/src/History/Series/index.tsx
+++ b/frontend/src/History/Series/index.tsx
@@ -9,7 +9,7 @@ import { useSeriesHistory } from "../../@redux/hooks";
import { useReduxAction } from "../../@redux/hooks/base";
import { EpisodesApi } from "../../apis";
import { HistoryIcon, LanguageText, TextPopover } from "../../components";
-import { BlacklistButton } from "../../generic/blacklist";
+import { BlacklistButton } from "../../DisplayItem/generic/blacklist";
import HistoryGenericView from "../generic";
interface Props {}
diff --git a/frontend/src/Movies/Router.tsx b/frontend/src/Movies/Router.tsx
deleted file mode 100644
index 7ef168ea3..000000000
--- a/frontend/src/Movies/Router.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React, { FunctionComponent } from "react";
-import { Route, Switch } from "react-router-dom";
-import Movie from ".";
-import MovieDetail from "./Detail";
-
-interface Props {}
-
-const Router: FunctionComponent = () => {
- return (
-
-
-
-
-
-
-
-
- );
-};
-
-export default Router;
diff --git a/frontend/src/Series/Router.tsx b/frontend/src/Series/Router.tsx
deleted file mode 100644
index bde7b89f7..000000000
--- a/frontend/src/Series/Router.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React, { FunctionComponent } from "react";
-import { Route, Switch } from "react-router-dom";
-import Series from ".";
-import Episodes from "./Episodes";
-
-interface Props {}
-
-const Router: FunctionComponent = () => {
- return (
-
-
-
-
-
-
-
-
- );
-};
-
-export default Router;
diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx
index 9e19d8295..04a35b980 100644
--- a/frontend/src/components/modals/HistoryModal.tsx
+++ b/frontend/src/components/modals/HistoryModal.tsx
@@ -3,7 +3,7 @@ import { Column } from "react-table";
import { useDidUpdate } from "rooks";
import { HistoryIcon, LanguageText, PageTable, TextPopover } from "..";
import { EpisodesApi, MoviesApi, useAsyncRequest } from "../../apis";
-import { BlacklistButton } from "../../generic/blacklist";
+import { BlacklistButton } from "../../DisplayItem/generic/blacklist";
import { AsyncOverlay } from "../async";
import BaseModal, { BaseModalProps } from "./BaseModal";
import { useModalPayload } from "./hooks";
diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx
index fddfac439..f178cf138 100644
--- a/frontend/src/components/modals/ItemEditorModal.tsx
+++ b/frontend/src/components/modals/ItemEditorModal.tsx
@@ -22,9 +22,7 @@ const Editor: FunctionComponent = (props) => {
);
// TODO: Separate movies and series
- const hasTask = useIsAnyTaskRunningWithId([
- payload ? GetItemId(payload) : -1,
- ]);
+ const hasTask = useIsAnyTaskRunningWithId([GetItemId(payload ?? {})]);
const profileOptions = useMemo[]>(
() =>