/* global window, React, ReactDOM, TRIPS, TripList, DetailPanel, DemandSidebar, AgentStrip, OverviewBoard, ConfirmModal, EditDrawer, StrategicHorizon, HoldModal, CancelModal, SplitModal, AgentPolicy, TodayTab */ // ============================================================ // Top-level app — view tabs, layout, state // Multi-DC aware: dcScope filters everything ('all' or a DC id). // ============================================================ const { useState: useAppState, useRef: useAppRef, useEffect: useAppEffect } = React; // ---------- DC scope selector (lives in the topbar) ---------- function DcScopeSelector({ scope, onChange, dcs }) { const [open, setOpen] = useAppState(false); const ref = useAppRef(null); useAppEffect(() => { const close = (e) => {if (ref.current && !ref.current.contains(e.target)) setOpen(false);}; document.addEventListener('mousedown', close); return () => document.removeEventListener('mousedown', close); }, []); const currentLabel = scope === 'all' ? `All my DCs (${dcs.length})` : dcs.find((d) => d.id === scope)?.name + ' DC'; const primary = dcs.find((d) => d.primary); return (
{open &&
AGGREGATE
SINGLE DC
{dcs.map((d) => )}
}
); } function TopBar({ view, onView, scope, onScope, dcs }) { const views = [ { id: 'today', label: 'Today' }, { id: 'tactical', label: 'Tactical', count: '7' }, { id: 'strategic', label: 'Strategic horizon' }, { id: 'policy', label: 'Agent policy' }]; return (
Mojro / Transportation Planner
{views.map((v) => )}
Wave 7 running · next in 23m
JM J. Morales · TP
); } function Placeholder({ title, body }) { return (
{title}
{body}
); } function App() { const [view, setView] = useAppState('today'); const [dcScope, setDcScope] = useAppState('all'); // 'all' | dc.id // selectedId === null → overview mode const [selectedId, setSelectedId] = useAppState(null); const [focus, setFocus] = useAppState(false); const [agentOpen, setAgentOpen] = useAppState(true); const [toast, setToast] = useAppState(null); const [checked, setChecked] = useAppState(new Set()); const [confirmOpen, setConfirmOpen] = useAppState(false); const [editingTripId, setEditingTripId] = useAppState(null); // single trip id const [bulkEditing, setBulkEditing] = useAppState(false); // Trip-action modals (Hold / Cancel / Split) const [holdOpen, setHoldOpen] = useAppState(false); const [cancelOpen, setCancelOpen] = useAppState(false); const [splitOpen, setSplitOpen] = useAppState(false); // Load-planner statuses keyed by trip id. Status: 'PENDING' | 'CONFIRMED'. const [lpStatuses, setLpStatuses] = useAppState({}); // Filter trips by scope. DC mapping: each trip has a `dc` field. // The detailed 7 trips are all Chicago (chi). const tripsInScope = dcScope === 'all' ? TRIPS : TRIPS.filter((t) => t.dc === dcScope); const trip = selectedId ? TRIPS.find((t) => t.id === selectedId) || TRIPS[0] : null; const editingTrip = editingTripId ? TRIPS.find((t) => t.id === editingTripId) : null; const editingMulti = bulkEditing ? TRIPS.filter((t) => checked.has(t.id)) : null; const showToast = (msg) => { setToast(msg); setTimeout(() => setToast(null), 3600); }; const onConfirm = () => {setConfirmOpen(true);}; const onConfirmPicked = (opt) => { if (opt && opt.unavailable) return; const label = opt && opt.name ? opt.name : 'recommended carrier'; showToast(`✓ ${trip.id} CONFIRMED → ${label}. Load instructions sent to WMS. ${opt && opt.kind === 'private' ? 'DAE triggered.' : 'Tender fired.'}`); setConfirmOpen(false); }; const onBatch = () => { showToast('✓ 12 pre-cleared trips auto-confirmed by agent. Tenders + DAE dispatched.'); }; const toggleCheck = (id) => { setChecked((prev) => { const next = new Set(prev); if (next.has(id)) next.delete(id);else next.add(id); return next; }); }; const clearChecks = () => setChecked(new Set()); const onEditSave = (vals) => { const targetLabel = bulkEditing ? `${editingMulti.length} trips` : editingTrip.id; showToast(`✓ ${targetLabel} updated · feasibility re-run · audit logged.`); setEditingTripId(null); setBulkEditing(false); if (bulkEditing) clearChecks(); }; const overviewMode = view === 'tactical' && !selectedId; // Trip action handlers const onHoldConfirm = (data) => { showToast(`✓ ${trip.id} placed on HOLD · reason: ${data.reason} · revisit ${data.until}.`); setHoldOpen(false); }; const onCancelConfirm = (data) => { showToast(`✕ ${trip.id} CANCELLED · ${data.returnOrders ? trip.orders.length + ' orders returned to pool' : 'orders dropped'}${data.notifyCustomer ? ' · customer notified' : ''}.`); setCancelOpen(false); setSelectedId(null); }; const onSplitConfirm = (data) => { showToast(`✓ ${trip.id} split → ${data.newTripId} created with ${data.move.length} order${data.move.length === 1 ? '' : 's'} · feasibility re-run on both.`); setSplitOpen(false); }; const onSendToLoadPlanner = (data) => { if (data.kind === 'cancel') { setLpStatuses((prev) => {const next = { ...prev };delete next[trip.id];return next;}); showToast(`Load planner request for ${trip.id} cancelled.`); return; } setLpStatuses((prev) => ({ ...prev, [trip.id]: { status: 'PENDING', planner: data.planner, note: data.note, at: data.at } })); showToast(`⇨ ${trip.id} sent to ${data.planner.name} for load-plan confirmation · trip now WAITING-LP.`); const tripId = trip.id; setTimeout(() => { setLpStatuses((prev) => prev[tripId] && prev[tripId].status === 'PENDING' ? { ...prev, [tripId]: { ...prev[tripId], status: 'CONFIRMED' } } : prev); }, 6000); }; const currentLpStatus = trip ? lpStatuses[trip.id] : null; // From Today tab: jump into Tactical, optionally focused on a DC or a trip const switchToTactical = ({ dc, tripId }) => { if (dc) setDcScope(dc); if (tripId) setSelectedId(tripId); setView('tactical'); }; return (
{view === 'today' && } {view === 'tactical' &&
{/* Trip list always present in tactical, except when focus is on */} {!focus && setEditingTripId(id)} onBulkEdit={() => setBulkEditing(true)} /> } {overviewMode ? setEditingTripId(id)} onToast={showToast} onBulkEdit={() => setBulkEditing(true)} onBatch={onBatch} dcScope={dcScope} dcs={window.DCS || []} /> : setFocus((f) => !f)} onConfirm={onConfirm} onClose={() => {setSelectedId(null);setFocus(false);}} onHold={() => setHoldOpen(true)} onSplit={() => setSplitOpen(true)} onCancel={() => setCancelOpen(true)} onEdit={() => setEditingTripId(trip.id)} lpStatus={currentLpStatus} onSendToLoadPlanner={onSendToLoadPlanner} /> } {!overviewMode && !focus && } setAgentOpen((o) => !o)} />
} {view === 'strategic' && } {view === 'policy' && } {/* Modals & drawers */} {confirmOpen && trip && setConfirmOpen(false)} onConfirm={onConfirmPicked} /> } {holdOpen && trip && setHoldOpen(false)} onConfirm={onHoldConfirm} /> } {cancelOpen && trip && setCancelOpen(false)} onConfirm={onCancelConfirm} /> } {splitOpen && trip && setSplitOpen(false)} onConfirm={onSplitConfirm} /> } {editingTrip && setEditingTripId(null)} onSave={onEditSave} /> } {bulkEditing && editingMulti && editingMulti.length > 0 && setBulkEditing(false)} onSave={onEditSave} /> } {toast &&
{toast}
}
); } ReactDOM.createRoot(document.getElementById('root')).render();