/* 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 (
);
}
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();