This is an automated email from the ASF dual-hosted git repository.

lynwee pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new b5039d2d9 feat(config-ui): use new layout to replace old (#6475)
b5039d2d9 is described below

commit b5039d2d9f5d46c5677647c97d9b714b82f81f13
Author: 青湛 <[email protected]>
AuthorDate: Tue Nov 21 14:43:51 2023 +1300

    feat(config-ui): use new layout to replace old (#6475)
---
 config-ui/package.json                             |   1 +
 config-ui/src/app/routrer.tsx                      |  41 +++--
 config-ui/src/components/logo/index.tsx            |   8 +-
 .../pages/blueprint/connection-detail/index.tsx    |  12 +-
 .../blueprint/detail/blueprint-detail-page.tsx     |   6 +-
 .../pages/blueprint/detail/configuration-panel.tsx |   2 +-
 .../src/pages/blueprint/detail/status-panel.tsx    |   2 +-
 config-ui/src/pages/blueprint/home/index.tsx       |   8 +-
 config-ui/src/routes/api-keys/api-keys.tsx         |   2 +-
 config-ui/src/routes/layout/config.tsx             | 116 +++++++++++++
 config-ui/src/routes/layout/layout.tsx             | 188 ++++++++-------------
 config-ui/src/routes/layout/use-menu.ts            |  77 ---------
 config-ui/src/routes/pipeline/pipeline.tsx         |   4 +-
 config-ui/src/routes/pipeline/pipelines.tsx        |   4 +-
 config-ui/yarn.lock                                |   1 +
 15 files changed, 240 insertions(+), 232 deletions(-)

diff --git a/config-ui/package.json b/config-ui/package.json
index 8e97c8d06..4376c7c7d 100644
--- a/config-ui/package.json
+++ b/config-ui/package.json
@@ -23,6 +23,7 @@
   },
   "dependencies": {
     "@ahooksjs/use-url-state": "^3.5.1",
+    "@ant-design/icons": "^5.2.6",
     "@blueprintjs/core": "^5.3.0",
     "@blueprintjs/datetime2": "^1.0.10",
     "@blueprintjs/popover2": "^2.0.10",
diff --git a/config-ui/src/app/routrer.tsx b/config-ui/src/app/routrer.tsx
index c3e86021b..8ca565965 100644
--- a/config-ui/src/app/routrer.tsx
+++ b/config-ui/src/app/routrer.tsx
@@ -72,24 +72,29 @@ export const router = createBrowserRouter([
         element: <BlueprintConnectionDetailPage />,
       },
       {
-        path: 'blueprints',
-        element: <BlueprintHomePage />,
-      },
-      {
-        path: 'blueprints/:id',
-        element: <BlueprintDetailPage />,
-      },
-      {
-        path: 'blueprints/:bid/:unique',
-        element: <BlueprintConnectionDetailPage />,
-      },
-      {
-        path: 'pipelines',
-        element: <Pipelines />,
-      },
-      {
-        path: 'pipeline/:id',
-        element: <Pipeline />,
+        path: 'advanced',
+        children: [
+          {
+            path: 'blueprints',
+            element: <BlueprintHomePage />,
+          },
+          {
+            path: 'blueprints/:id',
+            element: <BlueprintDetailPage />,
+          },
+          {
+            path: 'blueprints/:bid/:unique',
+            element: <BlueprintConnectionDetailPage />,
+          },
+          {
+            path: 'pipelines',
+            element: <Pipelines />,
+          },
+          {
+            path: 'pipeline/:id',
+            element: <Pipeline />,
+          },
+        ],
       },
       {
         path: 'keys',
diff --git a/config-ui/src/components/logo/index.tsx 
b/config-ui/src/components/logo/index.tsx
index 23362c9e4..f60e8ac98 100644
--- a/config-ui/src/components/logo/index.tsx
+++ b/config-ui/src/components/logo/index.tsx
@@ -25,9 +25,13 @@ const Wrapper = styled.div`
   justify-content: center;
 `;
 
-export const Logo = () => {
+interface Props {
+  style?: React.CSSProperties;
+}
+
+export const Logo = ({ style }: Props) => {
   return (
-    <Wrapper>
+    <Wrapper style={style}>
       <img src={import.meta.env.DEVLAKE_LOGO ?? LogoImg} alt="Logo" />
     </Wrapper>
   );
diff --git a/config-ui/src/pages/blueprint/connection-detail/index.tsx 
b/config-ui/src/pages/blueprint/connection-detail/index.tsx
index 6b821702f..ce9329a30 100644
--- a/config-ui/src/pages/blueprint/connection-detail/index.tsx
+++ b/config-ui/src/pages/blueprint/connection-detail/index.tsx
@@ -101,7 +101,7 @@ export const BlueprintConnectionDetailPage = () => {
     });
 
     if (success) {
-      navigate(pname ? `/projects/${pname}` : `/blueprints/${blueprint.id}`);
+      navigate(pname ? `/projects/${pname}` : 
`/advanced/blueprints/${blueprint.id}`);
     }
   };
 
@@ -134,7 +134,9 @@ export const BlueprintConnectionDetailPage = () => {
     if (success) {
       handleShowTips();
       navigate(
-        pname ? `/projects/${encodeName(pname)}?tab=configuration` : 
`/blueprints/${blueprint.id}?tab=configuration`,
+        pname
+          ? `/projects/${encodeName(pname)}?tab=configuration`
+          : `/advanced/blueprints/${blueprint.id}?tab=configuration`,
       );
     }
   };
@@ -176,9 +178,9 @@ export const BlueprintConnectionDetailPage = () => {
               { name: `Connection - ${connection.name}`, path: '' },
             ]
           : [
-              { name: 'Advanced', path: '/blueprints' },
-              { name: 'Blueprints', path: '/blueprints' },
-              { name: bid as any, path: `/blueprints/${bid}` },
+              { name: 'Advanced', path: '/advanced/blueprints' },
+              { name: 'Blueprints', path: '/advanced/blueprints' },
+              { name: bid as any, path: `/advanced/blueprints/${bid}` },
               { name: `Connection - ${connection.name}`, path: '' },
             ]
       }
diff --git a/config-ui/src/pages/blueprint/detail/blueprint-detail-page.tsx 
b/config-ui/src/pages/blueprint/detail/blueprint-detail-page.tsx
index 7d97bf3b4..42d927243 100644
--- a/config-ui/src/pages/blueprint/detail/blueprint-detail-page.tsx
+++ b/config-ui/src/pages/blueprint/detail/blueprint-detail-page.tsx
@@ -30,9 +30,9 @@ export const BlueprintDetailPage = () => {
   return (
     <PageHeader
       breadcrumbs={[
-        { name: 'Advanced', path: '/blueprints' },
-        { name: 'Blueprints', path: '/blueprints' },
-        { name: id, path: `/blueprints/${id}` },
+        { name: 'Advanced', path: '/advanced/blueprints' },
+        { name: 'Blueprints', path: '/advanced/blueprints' },
+        { name: id, path: `/advanced/blueprints/${id}` },
       ]}
     >
       <BlueprintDetail id={id} from={FromEnum.blueprint} />
diff --git a/config-ui/src/pages/blueprint/detail/configuration-panel.tsx 
b/config-ui/src/pages/blueprint/detail/configuration-panel.tsx
index 1dddb6069..d7f3a755e 100644
--- a/config-ui/src/pages/blueprint/detail/configuration-panel.tsx
+++ b/config-ui/src/pages/blueprint/detail/configuration-panel.tsx
@@ -218,7 +218,7 @@ export const ConfigurationPanel = ({ from, blueprint, 
onRefresh, onChangeTab }:
                       <Link
                         to={
                           from === FromEnum.blueprint
-                            ? 
`/blueprints/${blueprint.id}/${cs.plugin}-${cs.connectionId}`
+                            ? 
`/advanced/blueprints/${blueprint.id}/${cs.plugin}-${cs.connectionId}`
                             : 
`/projects/${encodeName(blueprint.projectName)}/${cs.plugin}-${cs.connectionId}`
                         }
                       >
diff --git a/config-ui/src/pages/blueprint/detail/status-panel.tsx 
b/config-ui/src/pages/blueprint/detail/status-panel.tsx
index 3f0763b95..07a99d159 100644
--- a/config-ui/src/pages/blueprint/detail/status-panel.tsx
+++ b/config-ui/src/pages/blueprint/detail/status-panel.tsx
@@ -116,7 +116,7 @@ export const StatusPanel = ({ from, blueprint, pipelineId, 
onRefresh }: Props) =
     });
 
     if (success) {
-      navigate('/blueprints');
+      navigate('/advanced/blueprints');
     }
   };
 
diff --git a/config-ui/src/pages/blueprint/home/index.tsx 
b/config-ui/src/pages/blueprint/home/index.tsx
index 5d8fb0b37..3c78f8e52 100644
--- a/config-ui/src/pages/blueprint/home/index.tsx
+++ b/config-ui/src/pages/blueprint/home/index.tsx
@@ -91,8 +91,8 @@ export const BlueprintHomePage = () => {
   return (
     <PageHeader
       breadcrumbs={[
-        { name: 'Advanced', path: '/blueprints' },
-        { name: 'Blueprints', path: '/blueprints' },
+        { name: 'Advanced', path: '/advanced/blueprints' },
+        { name: 'Blueprints', path: '/advanced/blueprints' },
       ]}
     >
       <S.Wrapper>
@@ -120,7 +120,7 @@ export const BlueprintHomePage = () => {
               title: 'Blueprint Name',
               key: 'name',
               render: (_, { id, name }) => (
-                <Link to={`/blueprints/${id}?tab=configuration`} style={{ 
color: '#292b3f' }}>
+                <Link to={`/advanced/blueprints/${id}?tab=configuration`} 
style={{ color: '#292b3f' }}>
                   <TextTooltip content={name}>{name}</TextTooltip>
                 </Link>
               ),
@@ -193,7 +193,7 @@ export const BlueprintHomePage = () => {
               width: 100,
               align: 'center',
               render: (val) => (
-                <Link to={`/blueprints/${val}?tab=configuration`}>
+                <Link to={`/advanced/blueprints/${val}?tab=configuration`}>
                   <IconButton icon="cog" tooltip="Detail" />
                 </Link>
               ),
diff --git a/config-ui/src/routes/api-keys/api-keys.tsx 
b/config-ui/src/routes/api-keys/api-keys.tsx
index ef3acdcef..f62ba1ad6 100644
--- a/config-ui/src/routes/api-keys/api-keys.tsx
+++ b/config-ui/src/routes/api-keys/api-keys.tsx
@@ -92,7 +92,7 @@ export const ApiKeys = () => {
 
   return (
     <PageHeader
-      breadcrumbs={[{ name: 'API Keys', path: '/api-keys' }]}
+      breadcrumbs={[{ name: 'API Keys', path: '/keys' }]}
       extra={<Button intent={Intent.PRIMARY} icon="plus" text="New API Key" 
onClick={() => setModal('create')} />}
     >
       <p>You can generate and manage your API keys to access the DevLake 
API.</p>
diff --git a/config-ui/src/routes/layout/config.tsx 
b/config-ui/src/routes/layout/config.tsx
new file mode 100644
index 000000000..b44d97bc0
--- /dev/null
+++ b/config-ui/src/routes/layout/config.tsx
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import {
+  AppstoreOutlined,
+  ProjectOutlined,
+  ExperimentOutlined,
+  KeyOutlined,
+  DashboardOutlined,
+  FileSearchOutlined,
+  ApiOutlined,
+  GithubOutlined,
+  SlackOutlined,
+} from '@ant-design/icons';
+
+import { DOC_URL } from '@/release';
+
+type MenuItem = {
+  key: string;
+  label: string;
+  icon?: React.ReactNode;
+  children?: MenuItem[];
+};
+
+export const menuItems: MenuItem[] = [
+  {
+    key: '/connections',
+    label: 'Connections',
+    icon: <AppstoreOutlined rev={undefined} />,
+  },
+  {
+    key: '/projects',
+    label: 'Projects',
+    icon: <ProjectOutlined rev={undefined} />,
+  },
+  {
+    key: '/advanced',
+    label: 'Advanced',
+    icon: <ExperimentOutlined rev={undefined} />,
+    children: [
+      {
+        key: '/advanced/blueprints',
+        label: 'Blueprints',
+      },
+      {
+        key: '/advanced/pipelines',
+        label: 'Pipelines',
+      },
+    ],
+  },
+  {
+    key: '/keys',
+    label: 'API Keys',
+    icon: <KeyOutlined rev={undefined} />,
+  },
+];
+
+const getMenuMatchs = (items: MenuItem[], parentKey?: string) => {
+  return items.reduce((pre, cur) => {
+    pre[cur.key] = {
+      ...cur,
+      parentKey,
+    };
+
+    if (cur.children) {
+      pre = { ...pre, ...getMenuMatchs(cur.children, cur.key) };
+    }
+
+    return pre;
+  }, {} as Record<string, MenuItem & { parentKey?: string }>);
+};
+
+export const menuItemsMatch = getMenuMatchs(menuItems);
+
+export const headerItems = [
+  {
+    link: import.meta.env.DEV ? 
`${window.location.protocol}//${window.location.hostname}:3002` : `/grafana`,
+    label: 'Dashboards',
+    icon: <DashboardOutlined rev={undefined} />,
+  },
+  {
+    link: DOC_URL.TUTORIAL,
+    label: 'Docs',
+    icon: <FileSearchOutlined rev={undefined} />,
+  },
+  {
+    link: '/api/swagger/index.html',
+    label: 'API',
+    icon: <ApiOutlined rev={undefined} />,
+  },
+  {
+    link: 'https://github.com/apache/incubator-devlake',
+    label: 'GitHub',
+    icon: <GithubOutlined rev={undefined} />,
+  },
+  {
+    link: 
'https://join.slack.com/t/devlake-io/shared_invite/zt-26ulybksw-IDrJYuqY1FrdjlMMJhs53Q',
+    label: 'Slack',
+    icon: <SlackOutlined rev={undefined} />,
+  },
+];
diff --git a/config-ui/src/routes/layout/layout.tsx 
b/config-ui/src/routes/layout/layout.tsx
index eca5c265b..82f8aae62 100644
--- a/config-ui/src/routes/layout/layout.tsx
+++ b/config-ui/src/routes/layout/layout.tsx
@@ -16,29 +16,27 @@
  *
  */
 
-import { useEffect, useRef } from 'react';
+import { useState, useEffect, useRef } from 'react';
 import { useLoaderData, Outlet, useNavigate, useLocation } from 
'react-router-dom';
 import { CSSTransition } from 'react-transition-group';
-import { Menu, MenuItem, Navbar, Alignment } from '@blueprintjs/core';
+import { Layout as AntdLayout, Menu, Divider } from 'antd';
 
 import { useAppDispatch, useAppSelector } from '@/app/hook';
 import { PageLoading, Logo, ExternalLink, IconButton } from '@/components';
 import { init, selectError, selectStatus } from '@/features';
-import { DOC_URL } from '@/release';
 import { TipsContextProvider, TipsContextConsumer } from '@/store';
 
-import DashboardIcon from '@/images/icons/dashboard.svg';
-import FileIcon from '@/images/icons/file.svg';
-import APIIcon from '@/images/icons/api.svg';
-import GitHubIcon from '@/images/icons/github.svg';
-import SlackIcon from '@/images/icons/slack.svg';
-
 import { loader } from './loader';
-import { useMenu, MenuItemType } from './use-menu';
+import { menuItems, menuItemsMatch, headerItems } from './config';
 import * as S from './styled';
 import './tips-transition.css';
 
+const { Sider, Header, Content, Footer } = AntdLayout;
+
 export const Layout = () => {
+  const [openKeys, setOpenKeys] = useState<string[]>([]);
+  const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
+
   const { version, plugins } = useLoaderData() as Awaited<ReturnType<typeof 
loader>>;
 
   const navigate = useNavigate();
@@ -48,14 +46,24 @@ export const Layout = () => {
   const status = useAppSelector(selectStatus);
   const error = useAppSelector(selectError);
 
-  const menu = useMenu();
-
   const tipsRef = useRef(null);
 
   useEffect(() => {
     dispatch(init(plugins));
   }, []);
 
+  useEffect(() => {
+    const curMenuItem = menuItemsMatch[pathname];
+    const parentKey = curMenuItem?.parentKey;
+    if (parentKey) {
+      setOpenKeys([parentKey]);
+    }
+  }, []);
+
+  useEffect(() => {
+    setSelectedKeys([pathname]);
+  }, [pathname]);
+
   if (['idle', 'loading'].includes(status)) {
     return <PageLoading />;
   }
@@ -64,122 +72,70 @@ export const Layout = () => {
     throw error.message;
   }
 
-  const handlePushPath = (it: MenuItemType) => {
-    if (!it.path) {
-      return;
-    }
-
-    if (!it.target) {
-      navigate(it.path);
-    } else {
-      window.open(it.path, '_blank');
-    }
-  };
-
-  const getGrafanaUrl = () => {
-    const suffix = '/';
-    const { protocol, hostname } = window.location;
-
-    return import.meta.env.DEV ? `${protocol}//${hostname}:3002${suffix}` : 
`/grafana${suffix}`;
-  };
-
   return (
     <TipsContextProvider>
       <TipsContextConsumer>
         {({ tips, setTips }) => (
-          <S.Wrapper>
-            <S.Sider style={{ userSelect: 'none' }}>
-              <Logo />
-              <Menu className="menu">
-                {menu.map((it) => {
-                  const paths = [it.path, ...(it.children ?? []).map((cit) => 
cit.path)];
-                  const active = !!paths.find((path) => 
pathname.includes(path));
-                  return (
-                    <MenuItem
-                      key={it.key}
-                      className="menu-item"
-                      text={it.title}
-                      icon={it.icon}
-                      active={active}
-                      onClick={() => handlePushPath(it)}
-                    >
-                      {it.children?.map((cit) => (
-                        <MenuItem
-                          key={cit.key}
-                          className="sub-menu-item"
-                          text={
-                            <S.SiderMenuItem>
-                              <span>{cit.title}</span>
-                            </S.SiderMenuItem>
-                          }
-                          icon={cit.icon}
-                          active={pathname.includes(cit.path)}
-                          disabled={cit.disabled}
-                          onClick={() => handlePushPath(cit)}
-                        />
-                      ))}
-                    </MenuItem>
-                  );
-                })}
-              </Menu>
-              <div className="copyright">
-                <div>{import.meta.env.DEVLAKE_COPYRIGHT ?? 'Apache 2.0 
License'}</div>
-                <div className="version">{version}</div>
+          <AntdLayout style={{ minHeight: '100vh' }}>
+            <Sider
+              style={{
+                position: 'fixed',
+                top: 0,
+                bottom: 0,
+                left: 0,
+                height: '100vh',
+                overflow: 'auto',
+              }}
+            >
+              <Logo style={{ padding: 24 }} />
+              <Menu
+                mode="inline"
+                theme="dark"
+                items={menuItems}
+                openKeys={openKeys}
+                selectedKeys={selectedKeys}
+                onSelect={({ key }) => navigate(key)}
+                onOpenChange={(keys) => setOpenKeys(keys)}
+              />
+              <div style={{ position: 'absolute', right: 0, bottom: 20, left: 
0, color: '#fff', textAlign: 'center' }}>
+                {version}
               </div>
-            </S.Sider>
-            <S.Main>
-              <S.Header>
-                <Navbar.Group align={Alignment.RIGHT}>
-                  <S.DashboardIcon>
-                    <ExternalLink link={getGrafanaUrl()}>
-                      <img src={DashboardIcon} alt="dashboards" />
-                      <span>Dashboards</span>
+            </Sider>
+            <AntdLayout style={{ marginLeft: 200 }}>
+              <Header
+                style={{
+                  display: 'flex',
+                  justifyContent: 'flex-end',
+                  alignItems: 'center',
+                  padding: '0 24px',
+                  height: 50,
+                  background: 'transparent',
+                }}
+              >
+                {headerItems.map((item, i) => (
+                  <>
+                    <ExternalLink key={item.label} link={item.link} style={{ 
display: 'flex', alignItems: 'center' }}>
+                      {item.icon}
+                      <span style={{ marginLeft: 4 }}>{item.label}</span>
                     </ExternalLink>
-                  </S.DashboardIcon>
-                  <Navbar.Divider />
-                  <ExternalLink link={DOC_URL.TUTORIAL}>
-                    <img src={FileIcon} alt="documents" />
-                    <span>Docs</span>
-                  </ExternalLink>
-                  <Navbar.Divider />
-                  <ExternalLink link="/api/swagger/index.html">
-                    <img src={APIIcon} alt="api" />
-                    <span>API</span>
-                  </ExternalLink>
-                  <Navbar.Divider />
-                  <a
-                    href="https://github.com/apache/incubator-devlake";
-                    rel="noreferrer"
-                    target="_blank"
-                    className="navIconLink"
-                  >
-                    <img src={GitHubIcon} alt="github" />
-                    <span>GitHub</span>
-                  </a>
-                  <Navbar.Divider />
-                  <a
-                    
href="https://join.slack.com/t/devlake-io/shared_invite/zt-26ulybksw-IDrJYuqY1FrdjlMMJhs53Q";
-                    rel="noreferrer"
-                    target="_blank"
-                  >
-                    <img src={SlackIcon} alt="slack" />
-                    <span>Slack</span>
-                  </a>
-                </Navbar.Group>
-              </S.Header>
-              <S.Inner>
-                <S.Content>
-                  <Outlet />
-                </S.Content>
-              </S.Inner>
+                    {i !== headerItems.length - 1 && <Divider type="vertical" 
/>}
+                  </>
+                ))}
+              </Header>
+              <Content style={{ margin: '16px 24px' }}>
+                <Outlet />
+              </Content>
+              <Footer style={{ color: '#a1a1a1', textAlign: 'center' }}>
+                {import.meta.env.DEVLAKE_COPYRIGHT ?? 'Apache 2.0 License'}
+              </Footer>
               <CSSTransition in={!!tips} unmountOnExit timeout={300} 
nodeRef={tipsRef} classNames="tips">
                 <S.Tips ref={tipsRef}>
                   <div className="content">{tips}</div>
                   <IconButton style={{ color: '#fff' }} icon="cross" 
tooltip="Close" onClick={() => setTips('')} />
                 </S.Tips>
               </CSSTransition>
-            </S.Main>
-          </S.Wrapper>
+            </AntdLayout>
+          </AntdLayout>
         )}
       </TipsContextConsumer>
     </TipsContextProvider>
diff --git a/config-ui/src/routes/layout/use-menu.ts 
b/config-ui/src/routes/layout/use-menu.ts
deleted file mode 100644
index 20055f293..000000000
--- a/config-ui/src/routes/layout/use-menu.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-import { useMemo } from 'react';
-import { IconName } from '@blueprintjs/core';
-
-export type MenuItemType = {
-  key: string;
-  title: string;
-  icon?: IconName;
-  path: string;
-  children?: MenuItemType[];
-  target?: boolean;
-  disabled: boolean;
-};
-
-export const useMenu = () => {
-  return useMemo(
-    () =>
-      [
-        {
-          key: 'connection',
-          title: 'Connections',
-          icon: 'data-connection',
-          path: '/connections',
-        },
-        {
-          key: 'project',
-          title: 'Projects',
-          icon: 'projects',
-          path: '/projects',
-        },
-        {
-          key: 'advanced',
-          title: 'Advanced',
-          icon: 'pulse',
-          // path: '/advanced',
-          children: [
-            {
-              key: 'blueprints',
-              title: 'Blueprints',
-              icon: '',
-              path: '/blueprints',
-            },
-            {
-              key: 'pipelines',
-              title: 'Pipelines',
-              icon: '',
-              path: '/pipelines',
-            },
-          ],
-        },
-        {
-          key: 'api-keys',
-          title: 'API Keys',
-          icon: 'key',
-          path: '/keys',
-        },
-      ] as MenuItemType[],
-    [],
-  );
-};
diff --git a/config-ui/src/routes/pipeline/pipeline.tsx 
b/config-ui/src/routes/pipeline/pipeline.tsx
index 1cf17f9b8..bfbec6cfa 100644
--- a/config-ui/src/routes/pipeline/pipeline.tsx
+++ b/config-ui/src/routes/pipeline/pipeline.tsx
@@ -27,8 +27,8 @@ export const Pipeline = () => {
   return (
     <PageHeader
       breadcrumbs={[
-        { name: 'Advanced', path: '/blueprints' },
-        { name: 'Pipelines', path: '/pipelines' },
+        { name: 'Advanced', path: '/advanced/blueprints' },
+        { name: 'Pipelines', path: '/advanced/pipelines' },
         {
           name: id as string,
           path: `/pipelines/${id}`,
diff --git a/config-ui/src/routes/pipeline/pipelines.tsx 
b/config-ui/src/routes/pipeline/pipelines.tsx
index 6fb57a5b6..87180f988 100644
--- a/config-ui/src/routes/pipeline/pipelines.tsx
+++ b/config-ui/src/routes/pipeline/pipelines.tsx
@@ -34,8 +34,8 @@ export const Pipelines = () => {
   return (
     <PageHeader
       breadcrumbs={[
-        { name: 'Advanced', path: '/blueprints' },
-        { name: 'Pipelines', path: '/pipelines' },
+        { name: 'Advanced', path: '/advanced/blueprints' },
+        { name: 'Pipelines', path: '/advanced/pipelines' },
       ]}
     >
       <PipelineTable
diff --git a/config-ui/yarn.lock b/config-ui/yarn.lock
index b705b2993..3b5ce4844 100644
--- a/config-ui/yarn.lock
+++ b/config-ui/yarn.lock
@@ -3315,6 +3315,7 @@ __metadata:
   resolution: "config-ui@workspace:."
   dependencies:
     "@ahooksjs/use-url-state": ^3.5.1
+    "@ant-design/icons": ^5.2.6
     "@blueprintjs/core": ^5.3.0
     "@blueprintjs/datetime2": ^1.0.10
     "@blueprintjs/popover2": ^2.0.10

Reply via email to