diff --git a/src/RootApp.tsx b/src/RootApp.tsx
index 0d66c15ad..956e57b1b 100644
--- a/src/RootApp.tsx
+++ b/src/RootApp.tsx
@@ -12,6 +12,7 @@ import { ApiProvider } from 'hooks/useApi';
import { WebConfigProvider } from 'hooks/useWebConfig';
import theme from 'themes/theme';
+const DashboardApp = loadable(() => import('./apps/dashboard/App'));
const ExperimentalApp = loadable(() => import('./apps/experimental/App'));
const StableApp = loadable(() => import('./apps/stable/App'));
@@ -31,6 +32,8 @@ const RootAppLayout = () => {
:
}
+
+
>
);
};
diff --git a/src/apps/dashboard/App.tsx b/src/apps/dashboard/App.tsx
new file mode 100644
index 000000000..a5f09d97a
--- /dev/null
+++ b/src/apps/dashboard/App.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+import { Route, Routes } from 'react-router-dom';
+
+import ConnectionRequired from 'components/ConnectionRequired';
+import { toViewManagerPageRoute } from 'components/router/LegacyRoute';
+import { toAsyncPageRoute } from 'components/router/AsyncRoute';
+import { toRedirectRoute } from 'components/router/Redirect';
+import ServerContentPage from 'components/ServerContentPage';
+
+import { REDIRECTS } from './routes/_redirects';
+import { ASYNC_ADMIN_ROUTES } from './routes/_asyncRoutes';
+import { LEGACY_ADMIN_ROUTES } from './routes/_legacyRoutes';
+import AppLayout from './AppLayout';
+
+const DashboardApp = () => (
+
+ }>
+ }>
+
+ {ASYNC_ADMIN_ROUTES.map(toAsyncPageRoute)}
+ {LEGACY_ADMIN_ROUTES.map(toViewManagerPageRoute)}
+
+
+ {/* TODO: Should the metadata manager be a separate app? */}
+ {toViewManagerPageRoute({
+ path: 'metadata',
+ pageProps: {
+ controller: 'edititemmetadata',
+ view: 'edititemmetadata.html'
+ }
+ })}
+
+
+ } />
+
+ {/* Suppress warnings for unhandled routes */}
+
+
+
+
+ {/* Redirects for old paths */}
+ {REDIRECTS.map(toRedirectRoute)}
+
+);
+
+export default DashboardApp;
diff --git a/src/apps/dashboard/AppLayout.tsx b/src/apps/dashboard/AppLayout.tsx
new file mode 100644
index 000000000..1e427d3c6
--- /dev/null
+++ b/src/apps/dashboard/AppLayout.tsx
@@ -0,0 +1,30 @@
+import { ThemeProvider } from '@mui/material/styles';
+import React from 'react';
+import { Outlet } from 'react-router-dom';
+
+import AppHeader from 'components/AppHeader';
+import Backdrop from 'components/Backdrop';
+import theme from 'themes/theme';
+
+const AppLayout = () => {
+ return (
+
+
+
+
+ {/*
+ * TODO: These components are not used, but views interact with them directly so the need to be
+ * present in the dom. We add them in a hidden element to prevent errors.
+ */}
+
+