62 lines
2.6 KiB
JavaScript
62 lines
2.6 KiB
JavaScript
// 3D Print Farm API Client
|
|
let livePrintJobs = [];
|
|
|
|
async function loadPrintFarmData() {
|
|
try {
|
|
const res = await fetch('/api/print-farm');
|
|
if (!res.ok) throw new Error("Failed to load Print Farm data");
|
|
livePrintJobs = await res.json();
|
|
|
|
renderPrintFarmQueue();
|
|
updatePrintFarmStats();
|
|
} catch (err) {
|
|
console.error("Print Farm Loading Error:", err);
|
|
}
|
|
}
|
|
|
|
function renderPrintFarmQueue() {
|
|
let container = document.getElementById('pf-jobs-container');
|
|
if (!container) {
|
|
const card = document.querySelector('#print-farm .card');
|
|
if (card) {
|
|
const queueCard = document.createElement('div');
|
|
queueCard.className = 'card';
|
|
queueCard.innerHTML = `
|
|
<div class="card-header"><i class="fa-solid fa-list-check"></i> Active Print Farm Job Queue</div>
|
|
<div id="pf-jobs-container" style="display:flex; flex-direction:column; gap:0.5rem;"></div>
|
|
`;
|
|
card.parentNode.insertBefore(queueCard, card.nextSibling);
|
|
container = document.getElementById('pf-jobs-container');
|
|
}
|
|
}
|
|
|
|
if (!container) return;
|
|
container.innerHTML = '';
|
|
|
|
livePrintJobs.forEach(job => {
|
|
const div = document.createElement('div');
|
|
div.style.cssText = 'background:#0b0f17; padding:0.6rem 0.8rem; border-radius:6px; font-size:0.75rem; display:flex; justify-content:space-between; align-items:center;';
|
|
|
|
let statusBadge = '<span style="color:var(--accent-emerald); font-weight:700;"><i class="fa-solid fa-check"></i> Complete</span>';
|
|
if (job.status === 'printing') {
|
|
statusBadge = '<span style="color:var(--accent-cyan); font-weight:700;"><i class="fa-solid fa-spinner fa-spin"></i> Printing</span>';
|
|
} else if (job.status === 'queued') {
|
|
statusBadge = '<span style="color:var(--text-muted); font-weight:600;"><i class="fa-solid fa-hourglass"></i> Queued</span>';
|
|
}
|
|
|
|
div.innerHTML = `
|
|
<div>
|
|
<strong>${job.part_name}</strong>
|
|
<div style="font-size:0.65rem; color:var(--text-muted);">${job.printer_model} • ${job.material} • ${job.weight_grams}g</div>
|
|
</div>
|
|
<div style="text-align:right;">
|
|
${statusBadge}
|
|
<div style="font-size:0.65rem; color:var(--accent-amber); font-weight:600;">${job.print_time_hours}h ($${parseFloat(job.cost_estimate).toFixed(2)})</div>
|
|
</div>
|
|
`;
|
|
container.appendChild(div);
|
|
});
|
|
}
|
|
|
|
window.loadPrintFarmData = loadPrintFarmData;
|