The function that the menu can be configured in the Web UI has been implemented

pull/58/head
YangZhang-GitHub 2021-08-02 13:07:04 +08:00
parent 4e11c36877
commit cfd8b68257
2 changed files with 211 additions and 39 deletions

View File

@ -1,42 +1,65 @@
import React, { useContext } from 'react'; import React, {useContext, useEffect, useState} from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import NavbarDropdown from './NavbarDropdown'; import NavbarDropdown from './NavbarDropdown';
import NavbarDropdownComponents from './NavbarDropdownComponents'; import NavbarDropdownComponents from './NavbarDropdownComponents';
import { // import {
// authenticationRoutes, // // authenticationRoutes,
// chatRoutes, // // chatRoutes,
// componentRoutes, // // componentRoutes,
// ECommerceRoutes, // // ECommerceRoutes,
// emailRoutes, // // emailRoutes,
// homeRoutes, // // homeRoutes,
// pageRoutes, // // pageRoutes,
// pluginRoutes, // // pluginRoutes,
// utilityRoutes, // // utilityRoutes,
// widgetsRoutes, // // widgetsRoutes,
// kanbanRoutes, // // kanbanRoutes,
dashboardRoutes, // dashboardRoutes,
spaceRoutes, // spaceRoutes,
equipmentRoutes, // equipmentRoutes,
meterRoutes, // meterRoutes,
tenantRoutes, // tenantRoutes,
storeRoutes, // storeRoutes,
shopfloorRoutes, // shopfloorRoutes,
combinedEquipmentRoutes, // combinedEquipmentRoutes,
auxiliarySystemRoutes, // auxiliarySystemRoutes,
fddRoutes, // fddRoutes,
monitoringRoutes, // monitoringRoutes,
advancedReportingRoutes, // advancedReportingRoutes,
knowledgeBaseRoutes // knowledgeBaseRoutes
} from '../../routes'; // } from '../../routes';
import routes from '../../routes';
import { NavItem } from 'reactstrap'; import { NavItem } from 'reactstrap';
import { NavLink } from 'react-router-dom'; import { NavLink } from 'react-router-dom';
import { breakpoints, getPageName } from '../../helpers/utils'; import {breakpoints, createCookie, getCookieValue, getPageName} from '../../helpers/utils';
import { navbarBreakPoint, topNavbarBreakpoint } from '../../config'; import {APIBaseURL, navbarBreakPoint, topNavbarBreakpoint} from '../../config';
import AppContext from '../../context/Context'; import AppContext from '../../context/Context';
import { withTranslation } from 'react-i18next'; import { withTranslation } from 'react-i18next';
import withRedirect from "../../hoc/withRedirect";
import {toast} from "react-toastify";
const NavbarTopDropDownMenus = ({ setNavbarCollapsed, setShowBurgerMenu, t }) => { const NavbarTopDropDownMenus = ({ setRedirectUrl, setRedirect, setNavbarCollapsed, setShowBurgerMenu, t }) => {
useEffect(() => {
let is_logged_in = getCookieValue('is_logged_in');
let user_name = getCookieValue('user_name');
let user_display_name = getCookieValue('user_display_name');
let user_uuid = getCookieValue('user_uuid');
let token = getCookieValue('token');
if (is_logged_in === null || !is_logged_in) {
setRedirectUrl(`/authentication/basic/login`);
setRedirect(true);
} else {
//update expires time of cookies
createCookie('is_logged_in', true, 1000 * 60 * 60 * 8);
createCookie('user_name', user_name, 1000 * 60 * 60 * 8);
createCookie('user_display_name', user_display_name, 1000 * 60 * 60 * 8);
createCookie('user_uuid', user_uuid, 1000 * 60 * 60 * 8);
createCookie('token', token, 1000 * 60 * 60 * 8);
}
});
const { isCombo, isTopNav } = useContext(AppContext); const { isCombo, isTopNav } = useContext(AppContext);
// const components = [componentRoutes, pluginRoutes, utilityRoutes]; // const components = [componentRoutes, pluginRoutes, utilityRoutes];
// const pages = [pageRoutes, kanbanRoutes, widgetsRoutes, chatRoutes, emailRoutes, ECommerceRoutes]; // const pages = [pageRoutes, kanbanRoutes, widgetsRoutes, chatRoutes, emailRoutes, ECommerceRoutes];
@ -46,8 +69,80 @@ const NavbarTopDropDownMenus = ({ setNavbarCollapsed, setShowBurgerMenu, t }) =>
isCombo && windowWidth < breakpoints[navbarBreakPoint] && setShowBurgerMenu(false); isCombo && windowWidth < breakpoints[navbarBreakPoint] && setShowBurgerMenu(false);
}; };
const isLanding = getPageName('landing'); const isLanding = getPageName('landing');
const [ viewComponentArr, setViewComponentArr] = useState([routes[0]]);
useEffect(() => {
let isResponseOK = false;
fetch(APIBaseURL + '/menus/web', {
method: 'GET',
headers: {
"Content-type": "application/json",
"User-UUID": getCookieValue('user_uuid'),
"Token": getCookieValue('token')
},
body: null,
}).then(response => {
//console.log(response);
if (response.ok) {
isResponseOK = true;
}
return response.json();
}).then(json => {
//console.log(json);
if (isResponseOK) {
const selectJson = {...json}
let newViewComponentArr = [routes[0]];
for (let i = 0; i < routes.length; i++) {
const route = routes[i];
let tempComponent = {... route};
if(route.to in selectJson && 'children' in route) {
let tempChild = [];
for (let j = 0; j < route.children.length; j++) {
const child = route.children[j];
if(selectJson[route.to].indexOf(child.to) !== -1) {
tempChild.push(child);
}
}
tempComponent.children = tempChild;
newViewComponentArr.push(tempComponent)
}else if(route.to in selectJson) {
newViewComponentArr.push(tempComponent)
}
}
setViewComponentArr(newViewComponentArr);
} else {
toast.error(json.description);
}
}).catch(err => {
console.log(err);
});
}, []);
return ( return (
<> <>
{viewComponentArr.length !== 0 && viewComponentArr.map(arr =>
{
if ('children' in arr) {
return(
<NavbarDropdownComponents
title={t(arr.name)}
items={[arr]}
handleSetNavbarCollapsed={handleSetNavbarCollapsed}
/>
)
}else {
return (
<NavItem onClick={handleSetNavbarCollapsed}>
<NavLink className="nav-link" to={arr.to}>
{t(arr.name)}
</NavLink>
</NavItem>
)
}
}
)}
{/*<NavbarDropdown {/*<NavbarDropdown
title={homeRoutes.name} title={homeRoutes.name}
items={homeRoutes.children} items={homeRoutes.children}
@ -70,7 +165,7 @@ const NavbarTopDropDownMenus = ({ setNavbarCollapsed, setShowBurgerMenu, t }) =>
Documentation Documentation
</NavLink> </NavLink>
</NavItem> */} </NavItem> */}
<NavItem onClick={handleSetNavbarCollapsed}> {/*<NavItem onClick={handleSetNavbarCollapsed}>
<NavLink className="nav-link" to={dashboardRoutes.to}> <NavLink className="nav-link" to={dashboardRoutes.to}>
{t(dashboardRoutes.name)} {t(dashboardRoutes.name)}
</NavLink> </NavLink>
@ -134,11 +229,11 @@ const NavbarTopDropDownMenus = ({ setNavbarCollapsed, setShowBurgerMenu, t }) =>
<NavLink className="nav-link" to={knowledgeBaseRoutes.to}> <NavLink className="nav-link" to={knowledgeBaseRoutes.to}>
{t(knowledgeBaseRoutes.name)} {t(knowledgeBaseRoutes.name)}
</NavLink> </NavLink>
</NavItem> </NavItem>*/}
</> </>
); );
}; };
NavbarTopDropDownMenus.propTypes = { setNavbarCollapsed: PropTypes.func.isRequired }; NavbarTopDropDownMenus.propTypes = { setNavbarCollapsed: PropTypes.func.isRequired };
export default withTranslation()(NavbarTopDropDownMenus); export default withTranslation()(withRedirect(NavbarTopDropDownMenus));

View File

@ -1,10 +1,10 @@
import classNames from 'classnames'; import classNames from 'classnames';
import is from 'is_js'; import is from 'is_js';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { useContext, useEffect, useRef } from 'react'; import React, {useContext, useEffect, useRef, useState} from 'react';
import { Button, Collapse, Nav, Navbar } from 'reactstrap'; import {Button, Collapse, Nav, Navbar, NavItem} from 'reactstrap';
import bgNavbarImg from '../../assets/img/generic/bg-navbar.png'; import bgNavbarImg from '../../assets/img/generic/bg-navbar.png';
import { navbarBreakPoint, topNavbarBreakpoint } from '../../config'; import {APIBaseURL, navbarBreakPoint, topNavbarBreakpoint} from '../../config';
import AppContext from '../../context/Context'; import AppContext from '../../context/Context';
import routes from '../../routes'; import routes from '../../routes';
import Flex from '../common/Flex'; import Flex from '../common/Flex';
@ -13,8 +13,31 @@ import NavbarTopDropDownMenus from './NavbarTopDropDownMenus';
import NavbarVerticalMenu from './NavbarVerticalMenu'; import NavbarVerticalMenu from './NavbarVerticalMenu';
import ToggleButton from './ToggleButton'; import ToggleButton from './ToggleButton';
import { withTranslation } from 'react-i18next'; import { withTranslation } from 'react-i18next';
import {createCookie, getCookieValue} from "../../helpers/utils";
import {toast} from "react-toastify";
import withRedirect from "../../hoc/withRedirect";
const NavbarVertical = ({ setRedirectUrl, setRedirect, navbarStyle, t }) => {
useEffect(() => {
let is_logged_in = getCookieValue('is_logged_in');
let user_name = getCookieValue('user_name');
let user_display_name = getCookieValue('user_display_name');
let user_uuid = getCookieValue('user_uuid');
let token = getCookieValue('token');
if (is_logged_in === null || !is_logged_in) {
setRedirectUrl(`/authentication/basic/login`);
setRedirect(true);
} else {
//update expires time of cookies
createCookie('is_logged_in', true, 1000 * 60 * 60 * 8);
createCookie('user_name', user_name, 1000 * 60 * 60 * 8);
createCookie('user_display_name', user_display_name, 1000 * 60 * 60 * 8);
createCookie('user_uuid', user_uuid, 1000 * 60 * 60 * 8);
createCookie('token', token, 1000 * 60 * 60 * 8);
}
});
const NavbarVertical = ({ navbarStyle, t }) => {
const navBarRef = useRef(null); const navBarRef = useRef(null);
const { const {
@ -32,6 +55,8 @@ const NavbarVertical = ({ navbarStyle, t }) => {
HTMLClassList.add('navbar-vertical-collapsed'); HTMLClassList.add('navbar-vertical-collapsed');
} }
const [ viewComponentArr, setViewComponentArr] = useState([routes[0]]);
useEffect(() => { useEffect(() => {
if (is.windows()) { if (is.windows()) {
HTMLClassList.add('windows'); HTMLClassList.add('windows');
@ -56,6 +81,58 @@ const NavbarVertical = ({ navbarStyle, t }) => {
}, 100); }, 100);
} }
}; };
useEffect(() => {
let isResponseOK = false;
fetch(APIBaseURL + '/menus/web', {
method: 'GET',
headers: {
"Content-type": "application/json",
"User-UUID": getCookieValue('user_uuid'),
"Token": getCookieValue('token')
},
body: null,
}).then(response => {
//console.log(response);
if (response.ok) {
isResponseOK = true;
}
return response.json();
}).then(json => {
//console.log(json);
if (isResponseOK) {
const selectJson = {...json}
let newViewComponentArr = [routes[0]];
for (let i = 0; i < routes.length; i++) {
const route = routes[i];
let tempComponent = {... route};
if(route.to in selectJson && 'children' in route) {
let tempChild = [];
for (let j = 0; j < route.children.length; j++) {
const child = route.children[j];
if(selectJson[route.to].indexOf(child.to) !== -1) {
tempChild.push(child);
}
}
tempComponent.children = tempChild;
newViewComponentArr.push(tempComponent)
}else if(route.to in selectJson) {
newViewComponentArr.push(tempComponent)
}
}
setViewComponentArr(newViewComponentArr);
} else {
toast.error(json.description);
}
}).catch(err => {
console.log(err);
});
}, [ ]);
return ( return (
<Navbar <Navbar
expand={navbarBreakPoint} expand={navbarBreakPoint}
@ -89,7 +166,7 @@ const NavbarVertical = ({ navbarStyle, t }) => {
} }
> >
<Nav navbar vertical> <Nav navbar vertical>
<NavbarVerticalMenu routes={routes} /> <NavbarVerticalMenu routes={viewComponentArr} />
</Nav> </Nav>
<div className="settings px-3 px-xl-0"> <div className="settings px-3 px-xl-0">
{isCombo && ( {isCombo && (
@ -130,4 +207,4 @@ NavbarVertical.defaultProps = {
navbarStyle: 'transparent' navbarStyle: 'transparent'
}; };
export default withTranslation()(NavbarVertical); export default withTranslation()(withRedirect(NavbarVertical));