/* "Before" screens — faithful recreations of the current Bootstrap views. */ /* ======================= DASHBOARD — BEFORE ======================= */ function DashboardBefore() { const kpis = [ { n: 4, label: 'Overdue Invoices', sub: '$3,240', color: '#eb3349', icon: 'bi-exclamation-circle' }, { n: 12, label: "Today's Jobs", color: '#11998e', icon: 'bi-calendar-check-fill' }, { n: 7, label: 'Overdue Jobs', color: '#f7971e', icon: 'bi-exclamation-triangle-fill' }, { n: 3, label: "Today's Appointments", color: '#4facfe', icon: 'bi-calendar-event-fill' }, { n: 8, label: 'Low Stock', color: '#a855f7', icon: 'bi-box-seam-fill' }, { n: 2, label: 'Maintenance Due', color: '#667eea', icon: 'bi-tools' }, ]; return (
{/* gradient welcome banner */}
Welcome Back!
Here's your shop overview for April 18, 2026 · What's New
Tip: Use job templates to speed up quoting for repeat customers.
Collected April 2026
$48,290
Outstanding A/R
$12,450
Active Customers
84
{/* rainbow KPIs */}
{kpis.map((k, i) => (
{k.n}
{k.sub &&
{k.sub}
}
{k.label}
))}
{/* body cards */}
Recent Jobs
{['J-2041 · Fence gate · Rodriguez', 'J-2040 · Wheel set · D&T Auto', 'J-2039 · Patio table · Mercer', 'J-2038 · Trailer frame · Bluegrass', 'J-2037 · Bumper · Heritage'].map((r, i) => (
{r} IN PROGRESS
))}
A/R Aging
{[['Current', 8420, '#11998e'], ['1–30 days', 2100, '#4facfe'], ['31–60 days', 1430, '#f7971e'], ['60+ days', 500, '#eb3349']].map(([l, v, c], i) => (
{l}${v.toLocaleString()}
))}
); } /* ======================= JOBS INDEX — BEFORE ======================= */ function JobsIndexBefore() { const jobs = [ ['J-2041', 'Fence gate — Anodized black', 'Rodriguez Metal', 'Apr 19', 'IN PROGRESS', 'HIGH', '$780'], ['J-2040', 'Wheel set (4) — Gloss white', 'D&T Auto', 'Apr 19', 'QUEUED', 'NORMAL', '$420'], ['J-2039', 'Patio table — Matte black', 'Mercer Residential', 'Apr 20', 'CURING', 'NORMAL', '$210'], ['J-2038', 'Trailer frame — Zinc primer', 'Bluegrass Trailers', 'Apr 22', 'IN PROGRESS', 'LOW', '$1,640'], ['J-2037', 'Bumper — Satin bronze', 'Heritage Restoration', 'Apr 22', 'READY FOR PICKUP', 'NORMAL', '$340'], ['J-2036', 'Railing — Hammered copper', 'Summit Builders', 'Apr 23', 'QUEUED', 'HIGH', '$980'], ]; const statusStyle = (s) => ({ 'IN PROGRESS': { bg: '#fef3c7', fg: '#92400e' }, 'QUEUED': { bg: '#dbeafe', fg: '#1e40af' }, 'CURING': { bg: '#fee2e2', fg: '#991b1b' }, 'READY FOR PICKUP': { bg: '#d1fae5', fg: '#065f46' }, }[s]); const prioStyle = (p) => ({ 'HIGH': { bg: '#fef3c7', fg: '#92400e' }, 'NORMAL': { bg: '#dbeafe', fg: '#1e40af' }, 'LOW': { bg: '#e5e7eb', fg: '#4b5563' }, }[p]); return (
{/* stat cards */}
{[ ['Total Jobs', '47', 'bi-briefcase', '#dbeafe', '#1e40af'], ['In Progress', '12', 'bi-hourglass-split', '#fef3c7', '#92400e'], ['Completed', '28', 'bi-check-circle', '#d1fae5', '#065f46'], ['Total Value', '$18,420', 'bi-currency-dollar', '#fee2e2', '#991b1b'], ].map(([l, v, ic, b, f], i) => (
{l}
{v}
))}
{/* table card */}
{['Job #', 'Description', 'Customer', 'Due', 'Status', 'Priority', 'Total', ''].map((h, i) => ( ))} {jobs.map((j, i) => { const st = statusStyle(j[4]); const pr = prioStyle(j[5]); return ( ); })}
{h}
{j[0]} {j[1]} {j[2]} {j[3]} {j[4]} {j[5]} {j[6]}
); } /* ======================= JOBS BOARD — BEFORE ======================= */ function JobsBoardBefore() { const cols = [ { title: 'INTAKE', count: 3, tint: '#dbeafe', accent: '#1e40af', cards: [ { id: 'J-2049', cust: 'Pine Ridge Metal', desc: 'Gate hardware set', due: 'Apr 24', prio: '#6c757d', powder: 'Gloss black' }, { id: 'J-2048', cust: 'Highway Fabworks', desc: 'Railing brackets', due: 'Apr 25', prio: '#ffc107', powder: 'Matte white' }, { id: 'J-2047', cust: 'Crestline Custom', desc: 'Bumper set', due: 'Apr 26', prio: '#6c757d', powder: 'Satin bronze' }, ]}, { title: 'PREP', count: 2, tint: '#fef3c7', accent: '#92400e', cards: [ { id: 'J-2045', cust: 'Rodriguez Metal', desc: 'Fence gate', due: 'Apr 19', prio: '#dc3545', powder: 'Anodized black' }, { id: 'J-2044', cust: 'D&T Auto', desc: 'Wheel set (4)', due: 'Apr 19', prio: '#ffc107', powder: 'Gloss white' }, ]}, { title: 'COATING', count: 3, tint: '#fee2e2', accent: '#991b1b', cards: [ { id: 'J-2042', cust: 'Mercer', desc: 'Patio table', due: 'Apr 20', prio: '#6c757d', powder: 'Matte black' }, { id: 'J-2041', cust: 'Bluegrass', desc: 'Trailer frame', due: 'Apr 22', prio: '#198754', powder: 'Zinc primer' }, { id: 'J-2040', cust: 'Summit', desc: 'Railing', due: 'Apr 23', prio: '#dc3545', powder: 'Hammered copper' }, ]}, { title: 'CURING', count: 2, tint: '#e0e7ff', accent: '#3730a3', cards: [ { id: 'J-2038', cust: 'Heritage', desc: 'Bumper', due: 'Apr 22', prio: '#6c757d', powder: 'Satin bronze' }, { id: 'J-2037', cust: 'Parkside', desc: 'Chair set (6)', due: 'Apr 22', prio: '#ffc107', powder: 'Gloss red' }, ]}, { title: 'READY', count: 1, tint: '#d1fae5', accent: '#065f46', cards: [ { id: 'J-2034', cust: 'Lakeside Marina', desc: 'Railing kit', due: 'Apr 18', prio: '#198754', powder: 'Matte white' }, ]}, ]; return (
{cols.map((c, i) => (
{c.title} {c.count}
{c.cards.map((card, j) => (
{card.id} {card.due}
{card.desc}
{card.cust}
{card.powder}
))}
))}
); } Object.assign(window, { DashboardBefore, JobsIndexBefore, JobsBoardBefore });