added contacts and addresses manager
This commit is contained in:
parent
4e76db4c9f
commit
275f4be0c1
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
27
frontend/src/components/Modal.tsx
Normal file
27
frontend/src/components/Modal.tsx
Normal 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;
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user