diff --git a/client/public/icons/sider/more.svg b/client/public/icons/sider/more.svg
new file mode 100644
index 0000000..c1efe35
--- /dev/null
+++ b/client/public/icons/sider/more.svg
@@ -0,0 +1,3 @@
+
diff --git a/client/src/App.tsx b/client/src/App.tsx
index a413c05..7fc96c3 100644
--- a/client/src/App.tsx
+++ b/client/src/App.tsx
@@ -6,14 +6,12 @@ import ProtectedRoute from './pages/ProtectedRoute';
function App() {
return (
-
-
- login
} />
-
}>
-
}>
-
-
-
+
+ login} />
+ }>
+ }>
+
+
);
}
diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx
new file mode 100644
index 0000000..18a3b7b
--- /dev/null
+++ b/client/src/components/Header.tsx
@@ -0,0 +1,56 @@
+import Title from 'antd/es/typography/Title';
+
+interface HeaderProps {
+ title: string;
+}
+
+export default function Header({ title }: HeaderProps) {
+ return (
+
+
+ {title}
+
+
+

+
+

+
+
+
+ );
+}
diff --git a/client/src/components/SiderMenu.tsx b/client/src/components/SiderMenu.tsx
index ea0d238..a80bced 100644
--- a/client/src/components/SiderMenu.tsx
+++ b/client/src/components/SiderMenu.tsx
@@ -1,61 +1,96 @@
-import { Menu, MenuProps } from 'antd';
-
-type MenuItem = Required['items'][number];
-
-function getItem(
- label: React.ReactNode,
- key: React.Key,
- icon?: React.ReactNode,
- children?: MenuItem[]
-): MenuItem {
- return {
- key,
- icon,
- children,
- label,
- } as MenuItem;
-}
-
-const sidebarItems: MenuItem[] = [
- getItem('VORKOUT', '0',
),
- getItem(
- 'Схемы процессов',
- '1',
-
- ),
- getItem(
- 'Запущенные процессы',
- '2',
-
- ),
- getItem(
- 'Настройки',
- 'sub1',
-
,
- [
- getItem('Учетные записи', '3'),
- getItem('Справичник событий', '4'),
- getItem('Конфигурация', '5'),
- ]
- ),
-];
+import { Divider, Menu } from 'antd';
+import React from 'react';
interface SiderMenuProps {
+ collapsed: boolean;
selectedKey: string;
hangleMenuClick: (e: any) => void;
}
export default function SiderMenu({
+ collapsed,
selectedKey,
hangleMenuClick,
}: SiderMenuProps) {
+ const menuItems = (
+
+
+ }
+ style={{ fontSize: '20px' }}
+ >
+ VORKOUT
+
+
+
+ }
+ >
+ Схемы процессов
+
+
+
+ }
+ >
+ Запущенные процессы
+
+
+ {!collapsed && }
+
+ }
+ title="Настройки"
+ expandIcon={false}
+ >
+
+ Учетные записи
+
+
+ Справочник событий
+
+
+ Конфигурация
+
+
+
+ );
+
return (
+ defaultOpenKeys={['sub1']}
+ >
+ {menuItems}
+
);
}
diff --git a/client/src/config/customTheme.ts b/client/src/config/customTheme.ts
new file mode 100644
index 0000000..b79c59a
--- /dev/null
+++ b/client/src/config/customTheme.ts
@@ -0,0 +1,14 @@
+export const theme = {
+ token: {
+ fontFamily: 'Roboto, sans-serif',
+ colorPrimary: '#548d10',
+ Menu: {
+ itemColor: 'f2f2f2',
+ itemBg: '#f2f2f2',
+ subMenuItemBg: '#f2f2f2',
+ },
+ Layout: {
+ bodyBg: '#f2f2f2',
+ },
+ },
+};
diff --git a/client/src/index.css b/client/src/index.css
index ec2585e..ee20a4e 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -11,3 +11,17 @@ code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
+
+.ant-menu-inline .ant-menu-submenu-selected {
+ border: none;
+}
+
+.ant-menu-inline .ant-menu-submenu-selected > .ant-menu-submenu-title {
+ color: #548d10;
+}
+
+.ant-menu-inline .ant-menu-item-selected {
+ background-color: transparent;
+ border: none;
+ color: #548d10;
+}
diff --git a/client/src/index.tsx b/client/src/index.tsx
index 7087bbe..cceac43 100644
--- a/client/src/index.tsx
+++ b/client/src/index.tsx
@@ -3,12 +3,17 @@ import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
+import { ConfigProvider } from 'antd';
+import { theme } from './config/customTheme';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
+
root.render(
-
-
-
+
+
+
+
+
);
diff --git a/client/src/pages/AccountsPage.tsx b/client/src/pages/AccountsPage.tsx
new file mode 100644
index 0000000..979f796
--- /dev/null
+++ b/client/src/pages/AccountsPage.tsx
@@ -0,0 +1,9 @@
+import Header from '../components/Header';
+
+export default function AccountsPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/client/src/pages/ConfigurationPage.tsx b/client/src/pages/ConfigurationPage.tsx
new file mode 100644
index 0000000..186a170
--- /dev/null
+++ b/client/src/pages/ConfigurationPage.tsx
@@ -0,0 +1,9 @@
+import Header from '../components/Header';
+
+export default function ConfigurationPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/client/src/pages/EventsListPage.tsx b/client/src/pages/EventsListPage.tsx
new file mode 100644
index 0000000..453381a
--- /dev/null
+++ b/client/src/pages/EventsListPage.tsx
@@ -0,0 +1,9 @@
+import Header from '../components/Header';
+
+export default function EventsListPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/client/src/pages/MainLayout.tsx b/client/src/pages/MainLayout.tsx
index 1641576..604e343 100644
--- a/client/src/pages/MainLayout.tsx
+++ b/client/src/pages/MainLayout.tsx
@@ -1,19 +1,40 @@
-import React, { useState } from 'react';
+/* eslint-disable react-hooks/exhaustive-deps */
+import React, { useEffect, useState } from 'react';
import { Layout } from 'antd';
import Sider from 'antd/es/layout/Sider';
import SiderMenu from '../components/SiderMenu';
+import { Route, Routes, useLocation, useNavigate } from 'react-router-dom';
+import ProcessDiagramPage from './ProcessDiagramPage';
+import RunningProcessesPage from './RunningProcessesPage';
+import AccountsPage from './AccountsPage';
+import EventsListPage from './EventsListPage';
+import ConfigurationPage from './ConfigurationPage';
export default function MainLayout() {
+ const navigate = useNavigate();
+ const location = useLocation();
const [collapsed, setCollapsed] = useState(false);
const [selectedKey, setSelectedKey] = useState('1');
+ useEffect(() => {
+ if (location.pathname === '/') {
+ navigate('/process-diagram');
+ }
+ }, [location.pathname]);
+
+ useEffect(() => {
+ setSelectedKey(location.pathname);
+ });
+
function hangleMenuClick(e: any) {
- if (e.key === '0') {
- setCollapsed((prev) => !prev);
+ const key = e.key;
+ if (key === '0') {
+ setCollapsed(!collapsed);
return;
}
- setSelectedKey(e.key);
+ setSelectedKey(key);
+ navigate(key);
}
return (
@@ -26,14 +47,23 @@ export default function MainLayout() {
width={'15%'}
collapsedWidth={'3.8%'}
trigger={null}
+ style={{ backgroundColor: '#f2f2f2' }}
>
- Main layout
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ 404 Not Found} />
+
);
diff --git a/client/src/pages/ProcessDiagramPage.tsx b/client/src/pages/ProcessDiagramPage.tsx
new file mode 100644
index 0000000..5f8d212
--- /dev/null
+++ b/client/src/pages/ProcessDiagramPage.tsx
@@ -0,0 +1,9 @@
+import Header from '../components/Header';
+
+export default function ProcessDiagramPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/client/src/pages/RunningProcessesPage.tsx b/client/src/pages/RunningProcessesPage.tsx
new file mode 100644
index 0000000..9063283
--- /dev/null
+++ b/client/src/pages/RunningProcessesPage.tsx
@@ -0,0 +1,9 @@
+import Header from '../components/Header';
+
+export default function RunningProcessesPage() {
+ return (
+ <>
+
+ >
+ );
+}