added contacts and addresses manager

This commit is contained in:
GotthardG 2024-11-04 21:38:12 +01:00
parent 4e76db4c9f
commit 275f4be0c1
3 changed files with 92 additions and 23 deletions

View File

@ -1,25 +1,53 @@
import React from 'react'; import React, { useState } from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import ResponsiveAppBar from './components/ResponsiveAppBar'; import ResponsiveAppBar from './components/ResponsiveAppBar';
import ShipmentView from './pages/ShipmentView'; import ShipmentView from './pages/ShipmentView';
import HomePage from './pages/HomeView'; // Assuming this is a default export import HomePage from './pages/HomeView';
import ResultsView from './pages/ResultsView'; import ResultsView from './pages/ResultsView';
import PlanningView from './pages/PlanningView'; import PlanningView from './pages/PlanningView';
import ContactsManager from './pages/ContactsManagerView'; import Modal from './components/Modal';
import AddressManager from './pages/AddressManagerView'; import AddressManager from './pages/AddressManagerView';
import ContactsManager from './pages/ContactsManagerView';
const App: React.FC = () => { const App: React.FC = () => {
const [openAddressManager, setOpenAddressManager] = useState(false);
const [openContactsManager, setOpenContactsManager] = useState(false);
const handleOpenAddressManager = () => {
setOpenAddressManager(true);
};
const handleCloseAddressManager = () => {
setOpenAddressManager(false);
};
const handleOpenContactsManager = () => {
setOpenContactsManager(true);
};
const handleCloseContactsManager = () => {
setOpenContactsManager(false);
};
return ( return (
<Router> <Router>
<ResponsiveAppBar /> <ResponsiveAppBar
onOpenAddressManager={handleOpenAddressManager}
onOpenContactsManager={handleOpenContactsManager}
/>
<Routes> <Routes>
<Route path="/" element={<HomePage />} /> <Route path="/" element={<HomePage />} />
<Route path="/shipments" element={<ShipmentView />} /> <Route path="/shipments" element={<ShipmentView />} />
<Route path="/planning" element={<PlanningView />} /> <Route path="/planning" element={<PlanningView />} />
<Route path="/results" element={<ResultsView />} /> <Route path="/results" element={<ResultsView />} />
<Route path="/contacts_manager" element={<ContactsManager />} /> {/* Other routes as necessary */}
<Route path="/addresses_manager" element={<AddressManager />} />
</Routes> </Routes>
<Modal open={openAddressManager} onClose={handleCloseAddressManager} title="Address Management">
<AddressManager />
</Modal>
<Modal open={openContactsManager} onClose={handleCloseContactsManager} title="Contacts Management">
<ContactsManager />
</Modal>
</Router> </Router>
); );
}; };

View File

@ -0,0 +1,27 @@
import * as React from 'react';
import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@mui/material';
interface ModalProps {
open: boolean;
onClose: () => void;
title: string;
children: React.ReactNode;
}
const Modal: React.FC<ModalProps> = ({ open, onClose, title, children }) => {
return (
<Dialog open={open} onClose={onClose} fullWidth maxWidth="md">
<DialogTitle>{title}</DialogTitle>
<DialogContent>
{children}
</DialogContent>
<DialogActions>
<Button onClick={onClose} color="primary">
Close
</Button>
</DialogActions>
</Dialog>
);
};
export default Modal;

View File

@ -11,11 +11,15 @@ import Container from '@mui/material/Container';
import Avatar from '@mui/material/Avatar'; import Avatar from '@mui/material/Avatar';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@mui/material/Tooltip';
import { Button } from '@mui/material'; import { Button } from '@mui/material';
import { Link } from 'react-router-dom'; // Import Link for navigation import { Link } from 'react-router-dom';
import logo from '../assets/icons/psi_01_sn.svg'; import logo from '../assets/icons/psi_01_sn.svg';
import '../App.css'; import '../App.css';
// Page definitions for navigation interface ResponsiveAppBarProps {
onOpenAddressManager: () => void;
onOpenContactsManager: () => void;
}
const pages = [ const pages = [
{ name: 'Home', path: '/' }, { name: 'Home', path: '/' },
{ name: 'Shipments', path: '/shipments' }, { name: 'Shipments', path: '/shipments' },
@ -23,15 +27,14 @@ const pages = [
{ name: 'Results', path: '/results' } { name: 'Results', path: '/results' }
]; ];
// User menu items
const userMenuItems = [ const userMenuItems = [
{ name: 'My Contacts', path: '/contacts_manager' }, { name: 'My Contacts', action: 'contacts' },
{ name: 'My Addresses', path: '/addresses_manager' }, { name: 'My Addresses', action: 'addresses' },
{ name: 'DUO', path: '/duo' }, { name: 'DUO', path: '/duo' },
{ name: 'Logout', path: '/logout' } { name: 'Logout', path: '/logout' }
]; ];
const ResponsiveAppBar: React.FC = () => { const ResponsiveAppBar: React.FC<ResponsiveAppBarProps> = ({ onOpenAddressManager, onOpenContactsManager }) => {
const [anchorElNav, setAnchorElNav] = useState<null | HTMLElement>(null); const [anchorElNav, setAnchorElNav] = useState<null | HTMLElement>(null);
const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null); const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null);
@ -51,12 +54,20 @@ const ResponsiveAppBar: React.FC = () => {
setAnchorElUser(null); setAnchorElUser(null);
}; };
const handleMenuItemClick = (action: string) => {
if (action === 'contacts') {
onOpenContactsManager();
} else if (action === 'addresses') {
onOpenAddressManager();
}
handleCloseUserMenu();
};
return ( return (
<div> <div>
<AppBar position="static" sx={{ backgroundColor: '#2F4858' }}> <AppBar position="static" sx={{ backgroundColor: '#2F4858' }}>
<Container maxWidth="xl"> <Container maxWidth="xl">
<Toolbar disableGutters> <Toolbar disableGutters>
{/* Logo and Title */}
<Link to="/" style={{ textDecoration: 'none' }}> <Link to="/" style={{ textDecoration: 'none' }}>
<img src={logo} height="50px" alt="PSI logo" /> <img src={logo} height="50px" alt="PSI logo" />
</Link> </Link>
@ -77,7 +88,6 @@ const ResponsiveAppBar: React.FC = () => {
Heidi v2 Heidi v2
</Typography> </Typography>
{/* Mobile Menu */}
<Box sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}> <Box sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}>
<IconButton <IconButton
size="large" size="large"
@ -112,12 +122,11 @@ const ResponsiveAppBar: React.FC = () => {
</Menu> </Menu>
</Box> </Box>
{/* Desktop Menu */}
<Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}> <Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
{pages.map((page) => ( {pages.map((page) => (
<Button <Button
key={page.name} key={page.name}
component={Link} // Make button a Link component={Link}
to={page.path} to={page.path}
sx={{ my: 2, color: 'white', display: 'block', fontSize: '1rem', padding: '12px 24px' }} sx={{ my: 2, color: 'white', display: 'block', fontSize: '1rem', padding: '12px 24px' }}
> >
@ -126,7 +135,6 @@ const ResponsiveAppBar: React.FC = () => {
))} ))}
</Box> </Box>
{/* User Settings Menu */}
<Box sx={{ flexGrow: 0 }}> <Box sx={{ flexGrow: 0 }}>
<Tooltip title="Open settings"> <Tooltip title="Open settings">
<IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}> <IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}>
@ -149,13 +157,19 @@ const ResponsiveAppBar: React.FC = () => {
open={Boolean(anchorElUser)} open={Boolean(anchorElUser)}
onClose={handleCloseUserMenu} onClose={handleCloseUserMenu}
> >
{userMenuItems.map((item) => ( {userMenuItems.map((item) =>
item.action ? (
<MenuItem key={item.name} onClick={() => handleMenuItemClick(item.action)}>
{item.name}
</MenuItem>
) : (
<MenuItem key={item.name} onClick={handleCloseUserMenu}> <MenuItem key={item.name} onClick={handleCloseUserMenu}>
<Link to={item.path} style={{ textDecoration: 'none', color: 'inherit' }}> <Link to={item.path} style={{ textDecoration: 'none', color: 'inherit' }}>
{item.name} {item.name}
</Link> </Link>
</MenuItem> </MenuItem>
))} )
)}
</Menu> </Menu>
</Box> </Box>
</Toolbar> </Toolbar>