// Shell.jsx — sidebar + topbar + layout (v2: reorganized for AppSheet-style structure) const NAV = [ { group: 'Workspace', items: [ { id: 'dashboard', label: 'Dashboard', icon: 'Home' }, ]}, { group: 'Operations', items: [ { id: 'bookings', label: 'Current Bookings', icon: 'Briefcase', badge: 7 }, { id: 'allbookings', label: 'All Bookings', icon: 'List' }, { id: 'notes', label: 'Daily Notes', icon: 'FileText' }, { id: 'mobile', label: 'My Job (Mobile)', icon: 'Phone' }, { id: 'completion', label: 'Job Completion', icon: 'PenTool' }, { id: 'rm', label: 'Repair & Maintenance', icon: 'Wrench' }, ]}, { group: 'Comms & Insights', items: [ { id: 'notifications', label: 'Notifications', icon: 'Bell', badge: 3 }, { id: 'analytics', label: 'Analytics', icon: 'BarChart' }, { id: 'export', label: 'AutoCount Export', icon: 'Download' }, ]}, { group: 'Master Data', items: [ { id: 'pricelist', label: 'Customer', icon: 'Users' }, { id: 'masterdata', label: 'Machinery', icon: 'Truck' }, { id: 'employees', label: 'Employees', icon: 'HardHat' }, { id: 'tools', label: 'Tools & Equipment', icon: 'Tool' }, { id: 'rmitems', label: 'Repair & Maintenance Items', icon: 'Layers' }, { id: 'stocks', label: 'Stocks', icon: 'Package' }, { id: 'suppliers', label: 'Supplier', icon: 'Factory' }, ]}, { group: 'Administration', items: [ { id: 'users', label: 'User Management', icon: 'Users' }, { id: 'permissions', label: 'Role Permissions', icon: 'Shield' }, { id: 'settings', label: 'Settings', icon: 'Settings' }, ]}, ]; function Sidebar({ page, setPage, user, open, setOpen, role }) { const filteredNav = NAV.map(g => ({ ...g, items: g.items.filter(i => canView(role, i.id)) })).filter(g => g.items.length > 0); return ( <>
setOpen(false)} /> ); } function Topbar({ title, sub, onMenu }) { return (
{title}
{sub ?
{sub}
: null}
); } function Toast({ msg, onDone, kind = 'success' }) { React.useEffect(() => { const t = setTimeout(onDone, 2400); return () => clearTimeout(t); }, []); return (
{msg}
); } Object.assign(window, { Sidebar, Topbar, Toast });