📅 aSc Editor Pro No File
📖 Guide 📄 aSc Sample XML
📊 Schedule 0
📋 Class Details
👨‍🏫 Teachers & Data 0
🏫 Manage Classes 0
📈 Statistics
Lessons0
Total Periods0.0
Filter StatusAll Data
Max Periods:
Class ⬍Subject ⬍Assigned TeachersPer ⬍
Class Workload Overview
Class ⬍Class Teacher ⬍Subjects ⬍Total Periods ⬍Status
⚡ Tools:
⚡ Sorting:

1. Get Started: Upload your aSc XML file using the "Open XML" button.

📄 Download Sample XML File (Download real XML from aSc PC software for your Data)

📊 Matrix Tools (Manual Data Collection):
Use the Matrix PDF or Matrix CSV buttons to print empty sheets for teachers to manually write their subject allocations.
Note: These are for manual use only. Importing them will NOT update lesson periods.

2. Edit Schedule: In the 'Schedule' tab, click on any teacher cell to assign/remove teachers.

3. Manage Workload: Use the Right Sidebar to check teacher loads.

4. Export: Click 'Save XML' to download your file for the aSc Desktop App.

Teacher Workload 0
`; w.document.write(html); w.document.close(); setTimeout(() => w.print(), 500); }// --- CSV EXPORT (MATRIX) --- function exportAllocationMatrixCSV() { let gradeCols = []; for(let g=1; g<=13; g++) { gradeCols.push(`${g}A`,`${g}B`,`${g}C`); } let csvContent = "ID,Code,Class Tr,Main Subject," + gradeCols.join(",") + ",Total\n"; let teacherSubCounts = {}; data.forEach(r => { r.tids.forEach(tid => { if(!teacherSubCounts[tid]) teacherSubCounts[tid] = {}; if(!teacherSubCounts[tid][r.subject]) teacherSubCounts[tid][r.subject] = 0; teacherSubCounts[tid][r.subject] += r.periods; }); });// SORTING BY SHORT NAME (CODE) Object.keys(teachers).sort((a,b)=>(shorts[a]||"").localeCompare(shorts[b]||"")).forEach(id => { let code = shorts[id] || ""; let mainSub = ""; if(teacherSubCounts[id]) { let sorted = Object.keys(teacherSubCounts[id]).sort((a,b) => teacherSubCounts[id][b] - teacherSubCounts[id][a]); mainSub = sorted[0].replace(/,/g, " "); } let emptyCommas = Array(40).fill('').join(','); csvContent += `${id},${code},,${mainSub},${emptyCommas}\n`; });let blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); let url = URL.createObjectURL(blob); let link = document.createElement("a"); link.href = url; link.download = "allocation_matrix.csv"; document.body.appendChild(link); link.click(); document.body.removeChild(link); }// --- ORIGINAL CSV EXPORT (TEACHER DATA) --- function exportCSV() { let ctMap = {}; Object.keys(classes).forEach(cid => { if(classes[cid].tid) ctMap[classes[cid].tid] = classes[cid].name; }); let csvContent = "ID,Full Name,Short Code,Color,Class Teacher Of,Email,Mobile\n"; Object.keys(teachers).forEach(id => { let cleanName = teachers[id].replace(/,/g, " "); let ctClass = ctMap[id] || ""; csvContent += `${id},${cleanName},${shorts[id]},${colors[id]},${ctClass},,\n`; }); let blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); let url = URL.createObjectURL(blob); let link = document.createElement("a"); link.href = url; link.download = "teacher_data.csv"; document.body.appendChild(link); link.click(); document.body.removeChild(link); }// --- SMART CSV IMPORT --- function importCSV(input) { if(!input.files[0]) return; let r = new FileReader(); r.onload = evt => { let lines = evt.target.result.split(/\r\n|\n/); let count = 0; // Detect CSV Type let header = lines[0].toLowerCase(); let isMatrix = header.includes("main subject") || header.includes("grade"); let classMap = {}; Object.keys(classes).forEach(cid => classMap[classes[cid].name] = cid); for(let i=1; i= 2) { let id = parts[0]; if(teachers[id]) { if(isMatrix) { if(parts[1]) shorts[id] = parts[1]; let ctClass = parts[2]; if(ctClass && classMap[ctClass]) { let cid = classMap[ctClass]; classes[cid].tid = id; let cNode = xml.querySelector(`class[id="${cid}"]`); if(cNode) cNode.setAttribute('teacherid', id); } let tNode = xml.querySelector(`teacher[id="${id}"]`); if(tNode) { tNode.setAttribute('short', shorts[id]); } } else { teachers[id] = parts[1]; if(parts[2]) shorts[id] = parts[2]; if(parts[3]) colors[id] = parts[3]; let ctClass = parts[4]; let tNode = xml.querySelector(`teacher[id="${id}"]`); if(tNode) { tNode.setAttribute('name', teachers[id]); tNode.setAttribute('short', shorts[id]); tNode.setAttribute('color', colors[id]); } if(ctClass && classMap[ctClass]) { let cid = classMap[ctClass]; classes[cid].tid = id; let cNode = xml.querySelector(`class[id="${cid}"]`); if(cNode) cNode.setAttribute('teacherid', id); } } count++; } } } input.value = ''; refresh(); renderTeacherManager(); renderClassManager(); showToast(`Updated ${count} teachers!`); }; r.readAsText(input.files[0]); }
🔴 Lesson List
SIDE BUTTON ON
Sign In Register
×

👋 Welcome Back!

🚀
Ready to Learn?Pick up where you left off.
🔑
Forgot Password?Click the link below to reset.
📢
New FeaturesCheck out the new AI Voice tool.

Sign In

👤
🔒
or continue with
Google Facebook

Already have an account? Register Now