custom-nas/viewer/printfarm.js

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;