// Hotel Walks — Property User Dashboard ("Today"). // The operator's daily view: outbound walks in progress, urgent items, queue health. (function() { const { Caps, Btn, Pill, SerifI, Hr, money } = window.UI; const { SmartKey } = window.HW; const STATUS_LABELS = { broadcasting: { label: "Broadcasting", tone: "warn" }, accepted: { label: "Accepted", tone: "good" }, letter_sent: { label: "Letter sent", tone: "filled" }, declined: { label: "Declined", tone: "muted" }, }; function PageHead() { const { ME } = window.HW_DATA; const today = new Date().toLocaleDateString(undefined, { weekday: "long", month: "long", day: "numeric" }); return (
{today}
Today at {ME.property.name}.
+ Send a walk
); } function StatStrip() { const stats = [ { label: "Walks open now", value: "3", sub: "2 broadcasting · 1 awaiting letter" }, { label: "Next escalation", value: "12m", sub: "Ifeoma Okonkwo · broadcasting to 3" }, ]; return (
{stats.map((s, i) => (
{s.label}
{s.value}
{s.sub}
))}
); } function SentTable() { const { SENT, HOTEL_BY_ID } = window.HW_DATA; return (
Outbound walks · today
In flight
New request →
{/* Header row */}
{["Sent", "Guest", "Re-housed at", "Rate", "Status", "Timer", ""].map((h, i) => (
{h}
))}
{SENT.map(w => { const s = STATUS_LABELS[w.status]; return (
{w.sentAt}
{w.guest.name}
{w.guest.confirmation} · {w.guest.party} guest{w.guest.party>1?"s":""} · {w.guest.nights}n
{w.to ? ( <>
{w.to.name}
{w.to.area}
) : (
— pending —
Broadcasting to {w.broadcastTo.length} partners
)}
{w.rate ? money(w.rate) : }
{s.label}
{w.status === "broadcasting" && (
{w.timer}m
)} {w.status === "accepted" && } {w.status === "letter_sent" && }
{w.status === "accepted" && ( Letter → )} {w.status === "letter_sent" && ( View )} {w.status === "broadcasting" && ( alert("Cancelled (demo)")}>Cancel )}
); })}
); } function CountdownDot({ mins }) { const tone = mins <= 5 ? "var(--warn)" : mins <= 15 ? "#c89048" : "var(--good)"; return ; } function InboundPanel() { const { INCOMING } = window.HW_DATA; return (
Inbound · awaiting your decision
You have {INCOMING.length} opportunities.
See all →
{INCOMING.map((op, i) => ( {op.urgent && (
Urgent
)} {op.when} · {op.rooms} room{op.rooms>1?"s":""}
{op.from.name}
{op.from.area}

Target rate Your rate
{op.targetRate ? money(op.targetRate) : "—"}
{money(op.myRate)}
Expires in {op.expiresIn}m Open →
))}
); } const responsiveCSS = ` @media (max-width: 900px) { .walks-grid { grid-template-columns: 1fr !important; gap: 8px; padding: 18px 0 !important; } .walks-grid > *:empty { display: none; } } @media (max-width: 720px) { .stat-strip { grid-template-columns: 1fr !important; padding: 0 20px !important; } .stat-strip > div { border-right: none !important; border-bottom: 1px solid var(--rule); padding: 20px 0 22px !important; } .stat-strip > div:last-child { border-bottom: none; } .stat-strip > div .serif-i { font-size: 36px !important; } .page-head { grid-template-columns: 1fr !important; } .page-head .serif-i { font-size: 38px !important; } .page-head .head-ctas { flex-direction: row !important; flex-wrap: wrap; } .page-head .head-ctas a { flex: 1; } .page-head .head-ctas a > * { width: 100%; } .inbound-grid { grid-template-columns: 1fr !important; } } `; function Dashboard() { return (
); } window.Screens = window.Screens || {}; window.Screens.Dashboard = Dashboard; })();