BBB — Test Checklist Dashboard (RM388.88) `;
const blob = new Blob([html], {type:'text/html'});
const url = URL.createObjectURL(blob);
downloadURL(url, `BBB_Test_Audit_Report_${(new Date()).toISOString().replace(/[:.]/g,'-')}.html`);
URL.revokeObjectURL(url);
}function downloadURL(url, filename){
const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); a.remove();
}// Buttons: export, print, reset
document.getElementById('export-json').addEventListener('click', exportJSON);
document.getElementById('export-html').addEventListener('click', exportHTML);
document.getElementById('print-report').addEventListener('click', () => window.print());
document.getElementById('reset-all').addEventListener('click', () => {
if(confirm('Reset saved checklist data? This cannot be undone.')) {
localStorage.removeItem(STORAGE_KEY);
location.reload();
}
});// Simulate buttons
document.getElementById('simulate-success').addEventListener('click', () => {
const name = document.getElementById('test-member').value;
const email = document.getElementById('test-email').value;
appendLog(`[${new Date().toLocaleString()}] SIM: Stripe success simulated for ${name} <${email}>`);
// auto mark steps 2,3,4,6,7 as pass for convenience
[2,3,4,6,7].forEach(id => {
state.steps[id].status = 'pass';
state.steps[id].ts = new Date().toISOString();
});
saveState();
});document.getElementById('simulate-fail').addEventListener('click', () => {
appendLog(`[${new Date().toLocaleString()}] SIM: Stripe decline simulated`);
// mark step 8 as pass (decline tested) and 2 as fail
state.steps[8].status = 'pass'; state.steps[8].ts = new Date().toISOString();
state.steps[2].status = 'fail'; state.steps[2].ts = new Date().toISOString();
saveState();
});// init render
render();// Ensure admin inputs propagate to state meta
document.getElementById('test-member').addEventListener('input', (e) => { state.meta.memberName = e.target.value; saveState();});
document.getElementById('test-email').addEventListener('input', (e) => { state.meta.memberEmail = e.target.value; saveState();});
})();