diff --git a/frontend/src/component/application/Application.tsx b/frontend/src/component/application/Application.tsx
index 70066f326f..8f0461b26c 100644
--- a/frontend/src/component/application/Application.tsx
+++ b/frontend/src/component/application/Application.tsx
@@ -1,5 +1,5 @@
/* eslint react/no-multi-comp:off */
-import React, { useContext, useState } from 'react';
+import React, { lazy, useContext, useState } from 'react';
import {
Box,
Avatar,
@@ -68,6 +68,8 @@ const StyledTab = styled(Tab)(({ theme }) => ({
},
}));
+const ApplicationOverview = lazy(() => import('./ApplicationOverview'));
+
export const Application = () => {
const useOldApplicationScreen = !useUiFlag('sdkReporting');
const navigate = useNavigate();
@@ -230,7 +232,7 @@ export const Application = () => {
/>
} />
- This is a placeholder
} />
+ } />
>
diff --git a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx b/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx
index cab7262337..ead182bb86 100644
--- a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx
+++ b/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx
@@ -14,7 +14,7 @@ import {
import { Link as LinkIcon } from '@mui/icons-material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { UPDATE_APPLICATION } from 'component/providers/AccessProvider/permissions';
-import { ApplicationView } from '../ApplicationView/ApplicationView';
+import { ApplicationOverview } from '../ApplicationOverview';
import { ApplicationUpdate } from '../ApplicationUpdate/ApplicationUpdate';
import { Dialogue } from 'component/common/Dialogue/Dialogue';
import { PageContent } from 'component/common/PageContent/PageContent';
@@ -76,7 +76,7 @@ export const ApplicationEdit = () => {
const tabData = [
{
label: 'Application overview',
- component: ,
+ component: ,
},
{
label: 'Edit application',
diff --git a/frontend/src/component/application/ApplicationOverview.tsx b/frontend/src/component/application/ApplicationOverview.tsx
new file mode 100644
index 0000000000..2cdad600f5
--- /dev/null
+++ b/frontend/src/component/application/ApplicationOverview.tsx
@@ -0,0 +1,84 @@
+import { usePageTitle } from 'hooks/usePageTitle';
+import { Mermaid } from 'component/common/Mermaid/Mermaid';
+import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
+import { Alert, styled } from '@mui/material';
+import { useThemeMode } from 'hooks/useThemeMode';
+import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
+import { useNavigate } from 'react-router-dom';
+
+const StyledMermaid = styled(Mermaid)(({ theme }) => ({
+ '#mermaid .node rect': {
+ fill: theme.palette.secondary.light,
+ stroke: theme.palette.secondary.border,
+ },
+ '#mermaid .application-container': {
+ // display: 'flex',
+ // padding: theme.spacing(4,3,3,3),
+ // flexDirection: 'column',
+ // alignItems: 'center',
+ // gap: theme.spacing(3),
+ backgroundColor: theme.palette.secondary.light,
+ },
+}));
+
+export const ApplicationOverview = () => {
+ usePageTitle('Applications - Overview');
+ const applicationName = useRequiredPathParam('name');
+ const { themeMode } = useThemeMode();
+ const navigate = useNavigate();
+
+ const app = {
+ projects: ['default', 'dx'],
+ featureCount: 12,
+ environments: [
+ {
+ name: 'production',
+ instanceCount: 34,
+ sdks: ['unleash-client-node:5.4.0'],
+ lastSeen: '2021-10-01T12:00:00Z',
+ },
+ {
+ name: 'development',
+ instanceCount: 16,
+ sdks: ['unleash-client-java:5.4.0'],
+ lastSeen: '2021-10-01T12:00:00Z',
+ },
+ ],
+ };
+
+ const applicationNode = `
+ ${applicationName}[${applicationName}]
+ `;
+
+ // @ts-ignore
+ window.navigateToInstances = (environment: string) => {
+ navigate(
+ `/applications/${applicationName}/instances?environment=${environment}`,
+ );
+ };
+
+ const graph = `
+ graph TD
+ subgraph _[ ]
+ direction BT
+ ${applicationNode}
+ ${app.environments
+ .map(
+ ({ name }, i) =>
+ `${name}("${name}") --- ${applicationName}
+ click ${name} navigateToInstances`,
+ )
+ .join('\n')}
+ end
+ `;
+
+ return (
+ No data available.}
+ elseShow={{graph}}
+ />
+ );
+};
+
+export default ApplicationOverview;
diff --git a/frontend/src/component/common/Mermaid/Mermaid.tsx b/frontend/src/component/common/Mermaid/Mermaid.tsx
index e4d41a58b2..9553914722 100644
--- a/frontend/src/component/common/Mermaid/Mermaid.tsx
+++ b/frontend/src/component/common/Mermaid/Mermaid.tsx
@@ -30,6 +30,7 @@ const StyledMermaid = styled('div')(({ theme }) => ({
mermaid.initialize({
startOnLoad: false,
theme: 'default',
+ securityLevel: 'loose',
themeCSS: `
.clusters #_ rect {
fill: transparent;
@@ -46,9 +47,10 @@ export const Mermaid = ({ children, ...props }: IMermaidProps) => {
const mermaidRef = useRef(null);
useEffect(() => {
- mermaid.render('mermaid', children, (svgCode) => {
+ mermaid.render('mermaid', children, (svgCode, bindFunctions) => {
if (mermaidRef.current) {
mermaidRef.current.innerHTML = svgCode;
+ bindFunctions?.(mermaidRef.current);
}
});
}, [children]);