From 3e4c7b2a502188ebde727a6919d9a5e04c939c10 Mon Sep 17 00:00:00 2001 From: SUN <350916525@qq.com> Date: Wed, 4 Jan 2023 13:26:16 +0800 Subject: [PATCH 1/2] [Dashboard] Feature - Changed Change the style of navigation menu - Added Workflow, Event Catalog menu items - Ignored vscode settings --- eventmesh-dashboard/.gitignore | 3 + eventmesh-dashboard/components/Sidebar.tsx | 192 - .../components/navigation/MenuItem.tsx | 98 + .../components/navigation/Menus.tsx | 160 + .../components/navigation/MenusMobile.tsx | 39 + .../components/navigation/Sidebar.tsx | 63 + eventmesh-dashboard/package.json | 1 + eventmesh-dashboard/pages/_app.tsx | 2 +- eventmesh-dashboard/static/images/logo.png | Bin 0 -> 58522 bytes eventmesh-dashboard/yarn.lock | 3314 +++++++++++++++++ 10 files changed, 3679 insertions(+), 193 deletions(-) delete mode 100644 eventmesh-dashboard/components/Sidebar.tsx create mode 100644 eventmesh-dashboard/components/navigation/MenuItem.tsx create mode 100644 eventmesh-dashboard/components/navigation/Menus.tsx create mode 100644 eventmesh-dashboard/components/navigation/MenusMobile.tsx create mode 100644 eventmesh-dashboard/components/navigation/Sidebar.tsx create mode 100644 eventmesh-dashboard/static/images/logo.png create mode 100644 eventmesh-dashboard/yarn.lock diff --git a/eventmesh-dashboard/.gitignore b/eventmesh-dashboard/.gitignore index d423e860ee..2fe260350e 100644 --- a/eventmesh-dashboard/.gitignore +++ b/eventmesh-dashboard/.gitignore @@ -124,3 +124,6 @@ yarn-error.log* # vercel .vercel + +# VS code settings +.vscode \ No newline at end of file diff --git a/eventmesh-dashboard/components/Sidebar.tsx b/eventmesh-dashboard/components/Sidebar.tsx deleted file mode 100644 index dd75092763..0000000000 --- a/eventmesh-dashboard/components/Sidebar.tsx +++ /dev/null @@ -1,192 +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. - */ - -/* eslint-disable react/jsx-props-no-spreading */ -import React, { ReactNode } from 'react'; -import { - IconButton, - Box, - CloseButton, - Flex, - Icon, - useColorModeValue, - Link, - Drawer, - DrawerContent, - Text, - useDisclosure, - BoxProps, - FlexProps, -} from '@chakra-ui/react'; -import { - FiList, - FiGrid, - FiServer, - FiDatabase, - FiMenu, -} from 'react-icons/fi'; -import { IconType } from 'react-icons'; - -interface LinkItemProps { - name: string; - icon: IconType; - href: string; -} - -const LinkItems: Array = [ - { name: 'Overview', icon: FiList, href: '/' }, - { name: 'Metrics', icon: FiMenu, href: '/metrics' }, - { name: 'Registry', icon: FiDatabase, href: '/registry' }, - { name: 'TCP Client', icon: FiServer, href: '/tcp' }, - { name: 'HTTP Client', icon: FiServer, href: '/http' }, - { name: 'gRPC Client', icon: FiServer, href: '/grpc' }, - { name: 'Topic', icon: FiGrid, href: '/topic' }, - { name: 'Event', icon: FiDatabase, href: '/event' }, -]; - -interface NavItemProps extends FlexProps { - icon: IconType; - href: string; - children: string | number; -} - -const NavItem = ({ - icon, href, children, ...rest -}: NavItemProps) => ( - - - {icon && ( - - )} - {children} - - -); - -interface SidebarProps extends BoxProps { - onClose: () => void; -} - -const SidebarContent = ({ onClose, ...rest }: SidebarProps) => ( - - - - EventMesh - - - - {LinkItems.map((link) => ( - - {link.name} - - ))} - -); - -interface MobileProps extends FlexProps { - onOpen: () => void; -} - -const MobileNav = ({ onOpen }: MobileProps) => ( - - } - /> - - - EventMesh - - -); - -const Sidebar = ({ children }: { children: ReactNode }) => { - const { isOpen, onOpen, onClose } = useDisclosure(); - return ( - - onClose} - display={{ base: 'none', md: 'block' }} - /> - - - - - - - - - {children} - - - ); -}; - -export default Sidebar; diff --git a/eventmesh-dashboard/components/navigation/MenuItem.tsx b/eventmesh-dashboard/components/navigation/MenuItem.tsx new file mode 100644 index 0000000000..1ed3f9b554 --- /dev/null +++ b/eventmesh-dashboard/components/navigation/MenuItem.tsx @@ -0,0 +1,98 @@ +import React, { FC, ReactNode } from 'react'; +import { + Flex, FlexProps, Link, Text, +} from '@chakra-ui/react'; + +interface MenuItemProps extends FlexProps { + key: string; + selected: boolean; + active: boolean; + href: string; + children: string | number; + setActiveName: (name: string) => void; +} + +export const MenuItem = ({ + selected, + active, + href, + children, + setActiveName, +}: MenuItemProps) => ( + setActiveName(children.toString())} + onMouseOut={() => setActiveName('')} + > + + {children} + + {/* */} + +); + +export const MenuGroupItem: FC<{ name: string; children: ReactNode }> = ( + props, +) => { + const { name, children } = props; + return ( + + {name && ( + + {name.toUpperCase()} + + )} + {children} + + ); +}; diff --git a/eventmesh-dashboard/components/navigation/Menus.tsx b/eventmesh-dashboard/components/navigation/Menus.tsx new file mode 100644 index 0000000000..4df43c0118 --- /dev/null +++ b/eventmesh-dashboard/components/navigation/Menus.tsx @@ -0,0 +1,160 @@ +import React, { FC, ReactNode, useState } from 'react'; +import { + Box, + BoxProps, + Button, + Flex, + useColorModeValue, + Image, +} from '@chakra-ui/react'; +import { IconType } from 'react-icons'; +import { ArrowBackIcon } from '@chakra-ui/icons'; + +import { useRouter } from 'next/router'; + +import { + FiList, FiGrid, FiServer, FiDatabase, FiMenu, +} from 'react-icons/fi'; +import LogoImg from '../../static/images/logo.png'; +import { MenuItem, MenuGroupItem } from './MenuItem'; + +const Menus: Array<{ + group?: string; + name: string; + icon: IconType; + href: string; + subPath?:string[] +}> = [ + { name: 'Overview', icon: FiList, href: '/' }, + { name: 'Metrics', icon: FiMenu, href: '/metrics' }, + { name: 'Registry', icon: FiDatabase, href: '/registry' }, + { name: 'Topic', icon: FiGrid, href: '/topic' }, + { name: 'Event', icon: FiDatabase, href: '/event' }, + { + group: 'Workflow', + name: 'Workflows', + icon: FiServer, + href: '/workflows', + subPath: ['/workflows/create'], + }, + { + group: 'Workflow', + name: 'Event Catalogs', + icon: FiServer, + href: '/eventCatalogs', + }, + { + group: 'Clients', + name: 'TCP', + icon: FiServer, + href: '/tcp', + }, + { + group: 'Clients', + name: 'HTTP', + icon: FiServer, + href: '/http', + }, + { + group: 'Clients', + name: 'gRPC', + icon: FiServer, + href: '/grpc', + }, +]; + +interface MenuProps extends BoxProps { + onClose: () => void; +} +interface IGroupItem { + name?: string; + children: ReactNode[]; +} + +const NavMenu: FC = ({ display = {}, onClose }) => { + const router = useRouter(); + const [curMenu, setCurMenu] = useState(''); + const curRoute = router.pathname; + + const MenuByGroup = Menus.reduce<{ + [groupName: string]: IGroupItem; + }>( + (groupItems, item) => { + const { + group, name, href, subPath, + } = item; + const menuItem = ( + setCurMenu(selectedName)} + > + {name} + + ); + + if (!group) { + groupItems.topMenu.children.push(menuItem); + return groupItems; + } + + if (!groupItems[group]) { + groupItems[group] = { name: group, children: [] }; + } + groupItems[group].children.push(menuItem); + + return groupItems; + }, + { topMenu: { children: [] } }, + ); + + return ( + + + Dan Abramov + + + + + {Object.entries(MenuByGroup).map((groupItem) => ( + + {groupItem[1].children} + + ))} + + + ); +}; + +export default NavMenu; diff --git a/eventmesh-dashboard/components/navigation/MenusMobile.tsx b/eventmesh-dashboard/components/navigation/MenusMobile.tsx new file mode 100644 index 0000000000..be083b9804 --- /dev/null +++ b/eventmesh-dashboard/components/navigation/MenusMobile.tsx @@ -0,0 +1,39 @@ +import { + IconButton, + Flex, + useColorModeValue, + Text, + FlexProps, +} from '@chakra-ui/react'; +import { FiMenu } from 'react-icons/fi'; + +interface MobileProps extends FlexProps { + onOpen: () => void; +} + +const MobileNav = ({ onOpen }: MobileProps) => ( + + } + /> + + + EventMesh + + +); + +export default MobileNav; diff --git a/eventmesh-dashboard/components/navigation/Sidebar.tsx b/eventmesh-dashboard/components/navigation/Sidebar.tsx new file mode 100644 index 0000000000..e8e349b23b --- /dev/null +++ b/eventmesh-dashboard/components/navigation/Sidebar.tsx @@ -0,0 +1,63 @@ +/* + * 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. + */ + +/* eslint-disable react/jsx-props-no-spreading */ +import React, { FC, ReactNode } from 'react'; +import { + Box, + useColorModeValue, + Drawer, + DrawerContent, + useDisclosure, +} from '@chakra-ui/react'; +import Menus from './Menus'; +import MenusMobile from './MenusMobile'; + +const Sidebar: FC<{ children: ReactNode }> = ({ children }) => { + const { isOpen, onOpen, onClose } = useDisclosure(); + return ( + <> + + onClose} + /> + + + {children} + + + + + + + + + ); +}; + +export default Sidebar; diff --git a/eventmesh-dashboard/package.json b/eventmesh-dashboard/package.json index 8617a49e93..d6834596df 100644 --- a/eventmesh-dashboard/package.json +++ b/eventmesh-dashboard/package.json @@ -9,6 +9,7 @@ "lint": "eslint . --cache --fix --ext .ts,.tsx" }, "dependencies": { + "@chakra-ui/icons": "^2.0.15", "@chakra-ui/react": "^2.1.2", "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", diff --git a/eventmesh-dashboard/pages/_app.tsx b/eventmesh-dashboard/pages/_app.tsx index a8dda2f86f..6095173752 100644 --- a/eventmesh-dashboard/pages/_app.tsx +++ b/eventmesh-dashboard/pages/_app.tsx @@ -21,7 +21,7 @@ import '@fontsource/inter'; import { ChakraProvider, extendTheme } from '@chakra-ui/react'; import type { AppProps } from 'next/app'; -import Sidebar from '../components/Sidebar'; +import Sidebar from '../components/navigation/Sidebar'; import { AppProvider } from '../context/context'; const theme = extendTheme({ diff --git a/eventmesh-dashboard/static/images/logo.png b/eventmesh-dashboard/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8545510d146e5b00916626c88d4e4df69b56b14 GIT binary patch literal 58522 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 Date: Wed, 4 Jan 2023 14:16:59 +0800 Subject: [PATCH 2/2] [Dashboard] Feature - Added Workflows --- eventmesh-dashboard/.gitignore | 5 +- eventmesh-dashboard/package.json | 1 + .../pages/workflows/create.tsx | 93 + .../pages/workflows/details.tsx | 93 + eventmesh-dashboard/pages/workflows/index.ts | 3 + .../pages/workflows/workflows.tsx | 115 + eventmesh-dashboard/yarn.lock | 3314 ----------------- 7 files changed, 309 insertions(+), 3315 deletions(-) create mode 100644 eventmesh-dashboard/pages/workflows/create.tsx create mode 100644 eventmesh-dashboard/pages/workflows/details.tsx create mode 100644 eventmesh-dashboard/pages/workflows/index.ts create mode 100644 eventmesh-dashboard/pages/workflows/workflows.tsx delete mode 100644 eventmesh-dashboard/yarn.lock diff --git a/eventmesh-dashboard/.gitignore b/eventmesh-dashboard/.gitignore index 2fe260350e..8453b69998 100644 --- a/eventmesh-dashboard/.gitignore +++ b/eventmesh-dashboard/.gitignore @@ -126,4 +126,7 @@ yarn-error.log* .vercel # VS code settings -.vscode \ No newline at end of file +.vscode + +# Yarn lock +yarn.lock \ No newline at end of file diff --git a/eventmesh-dashboard/package.json b/eventmesh-dashboard/package.json index d6834596df..6d8ae58caa 100644 --- a/eventmesh-dashboard/package.json +++ b/eventmesh-dashboard/package.json @@ -14,6 +14,7 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@fontsource/inter": "^4.5.10", + "@monaco-editor/react": "^4.4.6", "axios": "^0.27.2", "cloudevents": "^6.0.2", "framer-motion": "^6.3.6", diff --git a/eventmesh-dashboard/pages/workflows/create.tsx b/eventmesh-dashboard/pages/workflows/create.tsx new file mode 100644 index 0000000000..41ed21bf7b --- /dev/null +++ b/eventmesh-dashboard/pages/workflows/create.tsx @@ -0,0 +1,93 @@ +import React, { useRef } from 'react'; +import Head from 'next/head'; +import type { NextPage } from 'next'; + +import { + Stack, + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + Grid, + GridItem, + FormControl, + FormLabel, + Input, + Button, + Textarea, +} from '@chakra-ui/react'; + +import Editor from '@monaco-editor/react'; +import { useRouter } from 'next/router'; + +const Workflows: NextPage = () => { + const editorRef = useRef(null); + const router = useRouter(); + + const handleEditorDidMount = (editor: any) => { + // here is the editor instance + // you can store it in `useRef` for further usage + console.log('hhh'); + editorRef.current = editor; + }; + + return ( + <> + + Create Workflow | Apache EventMesh Dashboard + + + + Workflows + + + + Create + + + + + + + Workflow name + + + + + Description +