/* "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
{/* rainbow KPIs */}
{kpis.map((k, i) => (
))}
{/* 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) => (
))}
);
}
/* =======================
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) => (
))}
{/* table card */}
{['Job #', 'Description', 'Customer', 'Due', 'Status', 'Priority', 'Total', ''].map((h, i) => (
| {h} |
))}
{jobs.map((j, i) => {
const st = statusStyle(j[4]); const pr = prioStyle(j[5]);
return (
| {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 });