\n
2026/2027 · Semester Ganjil · Aktif
Ringkasan Sistem

Dashboard

Pantau kondisi Rapor Takhasus pada periode aktif secara ringkas.
Total Guru♙
24
Guru terdaftar
Total Siswa♙
32
Siswa periode aktif
Mata Pelajaran◫
4
BTA · Doa · Mengaji · Surat
Kelas▦
6
Kelas aktif
Progres Rapor per Kelas
Persentase pengisian nilai pada periode 2026/2027 · Semester Ganjil.
SelesaiBelum
Kelas 1
100%
Kelas 2
83%
Kelas 3
80%
Kelas 4
50%
Kelas 5
100%
Kelas 6
40%
Status Rapor
Ringkasan penyelesaian pengisian.
● Monitoring
72%SELESAI
Selesai72%
Dalam proses18%
Belum diisi10%
Progres per Mata Pelajaran Takhasus
Monitoring pengisian empat komponen Rapor Takhasus.
BTA
85%
Doa
75%
Mengaji
90%
Surat
65%
Monitoring Kelas
Ringkasan kesiapan rapor setiap kelas.
KelasSiswaSudah LengkapProgresStatus
Kelas 155
100%
Selesai
Kelas 265
83%
Baik
Kelas 354
80%
Baik
Kelas 463
50%
Proses
Kelas 555
100%
Selesai
Kelas 652
40%
Perlu perhatian
⚠️ Perlu Perhatian
Hal yang perlu ditindaklanjuti Admin/Guru.
Kelas 63 siswa belum lengkap pada komponen Hafalan Surat.Perlu ditindaklanjuti
Kelas 4Progres pengisian Mengaji masih sekitar 50%.Proses
Hafalan SuratMenjadi komponen dengan progres terendah saat ini.65%
Validasi NilaiPastikan semua nilai sudah diperiksa sebelum cetak rapor.Checklist
Aktivitas Terbaru
Aktivitas sistem pada periode aktif.
Guru menyelesaikan nilai BTA Kelas 5.
14:32 · Hari ini
Guru memperbarui Hafalan Doa Kelas 4.
14:18 · Hari ini
Admin memperbarui data siswa.
13:50 · Hari ini
Guru mengisi nilai Mengaji Kelas 3.
13:22 · Hari ini
Status Sistem
Periode yang sedang digunakan untuk pengelolaan rapor.
● Sistem Aktif
Dashboard ini saat ini menggunakan data contoh untuk preview. Setelah terhubung ke MySQL, angka, grafik, progres kelas, status rapor, dan aktivitas akan dihitung otomatis berdasarkan tahun pelajaran dan semester yang sedang aktif.
Informasi
i
Konfirmasi
!
Apakah Anda yakin?
`; downloadBlobFile(new Blob(['\ufeff',html],{type:'application/vnd.ms-excel;charset=utf-8'}),'template-data-guru.xls'); } if(typeof notify==='function') notify('success','Template Excel Berhasil','Template Data Guru berhasil dibuat dan siap diisi.'); } function openGuruImport(){ const input=document.getElementById('guruExcelInput'); if(!input) return; input.value=''; input.click(); } function handleGuruExcelImport(event){ const file=event.target.files?.[0]; if(!file) return; if(!/\.(xlsx|xls)$/i.test(file.name)){ if(typeof notify==='function')notify('error','Format Tidak Sesuai','Pilih file Excel .xlsx atau .xls.'); return; } if(typeof XLSX==='undefined'){ if(typeof notify==='function')notify('error','Modul Excel Belum Siap','Pustaka Excel belum dimuat. Periksa koneksi internet lalu coba lagi.'); return; } const reader=new FileReader(); reader.onload=function(e){ try{ const wb=XLSX.read(new Uint8Array(e.target.result),{type:'array'}); const ws=wb.Sheets[wb.SheetNames[0]]; const data=XLSX.utils.sheet_to_json(ws,{defval:''}); if(!data.length) throw new Error('File tidak berisi data.'); const required=['Nama Guru','NIP / NPK / PegID','Jabatan','Jenis Kelamin']; const missing=required.filter(k=>!(k in data[0])); if(missing.length) throw new Error('Kolom wajib tidak ditemukan: '+missing.join(', ')); const invalid=data.filter(r=>!String(r['Nama Guru']||'').trim()||!String(r['NIP / NPK / PegID']||'').trim()); if(invalid.length) throw new Error(invalid.length+' baris belum memiliki Nama Guru atau NIP/NPK/PegID.'); showGuruImportPreview(data,file.name); }catch(err){ if(typeof notify==='function')notify('error','Import Gagal',err.message||'File Excel tidak dapat dibaca.'); } }; reader.readAsArrayBuffer(file); } function showGuruImportPreview(data,filename){ closeGuruImportPreview(); const layer=document.createElement('div'); layer.id='guruImportPreview'; layer.className='guru-modal-layer show'; layer.setAttribute('aria-hidden','false'); const esc=v=>String(v??'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); const sample=data.slice(0,8); layer.innerHTML=''; document.body.appendChild(layer); document.getElementById('confirmGuruImportBtn').addEventListener('click',()=>confirmGuruImport(data)); } function closeGuruImportPreview(){ const el=document.getElementById('guruImportPreview'); if(el)el.remove(); } function confirmGuruImport(data){ const tbody=document.querySelector('#page-guru .data-table tbody'); if(!tbody){closeGuruImportPreview();if(typeof notify==='function')notify('error','Import Gagal','Tabel Data Guru tidak ditemukan.');return;} let added=0; data.forEach(r=>{ const name=String(r['Nama Guru']||'').trim(), id=String(r['NIP / NPK / PegID']||'').trim(); if(!name||!id)return; const duplicate=Array.from(tbody.querySelectorAll('tr')).some(tr=>tr.cells[2]?.textContent.trim()===id); if(duplicate)return; const jab=String(r['Jabatan']||'Guru').trim(), gender=String(r['Jenis Kelamin']||'Laki-laki').trim(); const tr=document.createElement('tr'); const n=tbody.querySelectorAll('tr').length+1; tr.innerHTML=''+n+'
'+name.replace(/&/g,'&').replace(/
Tenaga pendidik
'+id.replace(/&/g,'&').replace(/'+jab.replace(/&/g,'&').replace(/'+gender.replace(/&/g,'&').replace(/Belum Ada Akun'; tbody.appendChild(tr); added++; }); closeGuruImportPreview(); if(typeof renderGuruStats==='function')renderGuruStats(); if(typeof notify==='function')notify(added?'success':'info',added?'Import Berhasil':'Tidak Ada Data Baru',added+' data Guru ditambahkan. Data duplikat dilewati.'); } function exportGuruExcel(){ const rows=guruExcelRows(); if(!rows.length){if(typeof notify==='function')notify('error','Export Gagal','Tidak ada data Guru yang dapat diekspor.');return;} if(typeof XLSX==='undefined'){if(typeof notify==='function')notify('error','Modul Excel Belum Siap','Pustaka Excel belum dimuat.');return;} const ws=XLSX.utils.json_to_sheet(rows); const wb=XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb,ws,'Data Guru'); XLSX.writeFile(wb,'data-guru.xlsx'); if(typeof notify==='function')notify('success','Export Excel Berhasil','Data Guru berhasil diekspor ke file Excel.'); } ';const blob=new Blob(['\ufeff',html],{type:'application/vnd.ms-excel;charset=utf-8;'}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download=`leger-takhasus-${String(cls==='all'?'semua-kelas':cls).replace(/[^a-z0-9-]/gi,'-')}-${year.replace('/','-')}-${sem.toLowerCase()}.xls`;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);notify?.('success','Legger Excel Diunduh','File legger berisi nilai setiap siswa per mata pelajaran.');} function cetakBatch(type){let list;if(type==='selected'){const ids=[...document.querySelectorAll('#cetakStudentRows .cetak-student-check:checked')].map(c=>c.value);if(!ids.length){notify?.('warning','Belum Ada Siswa Dipilih','Centang setidaknya satu siswa pada tabel terlebih dahulu.');return}list=cetakStudentList().filter(st=>ids.includes(String(st.nis)))}else list=cetakStudentList();if(!list.length){notify?.('warning','Data Kosong','Tidak ada siswa untuk dicetak pada filter ini.');return}const actualType=type==='selected'?'rapor':type;cetakBuildPrint(actualType,list);} function cetakBuildPrint(type,list){if(type==='rapor'){cetakBuildReportCards(list);return;}readPrintSettings();const area=document.getElementById('reportPrintArea'),year=document.getElementById('cetakYear')?.value||'2026/2027',sem=document.getElementById('cetakSemester')?.value||'Ganjil',cls=document.getElementById('cetakClass')?.value||'Semua Kelas';const wm=printSettings.watermark==='none'?'':`
${escapePrint(printSettings.watermark==='custom'?(printSettings.watermarkText||'SALINAN'):printSettings.watermark.toUpperCase())}
`;const titleMap={rapor:'RAPOR TAKHASUS MADRASAH',nilai:'DAFTAR NILAI TAKHASUS',sampul:'SAMPUL RAPOR TAKHASUS',identitas:'IDENTITAS SISWA',leger:'LEGGER NILAI TAKHASUS',rekap:'REKAP NILAI SISWA'};let content='';if(type==='sampul'||type==='identitas'){content=list.map((st,i)=>`
${wm}

KEMENTERIAN AGAMA REPUBLIK INDONESIA

${titleMap[type]}

MI Modern Al Azhary


Nama Siswa: ${escapePrint(st.name)}

NIS: ${escapePrint(st.nis||'—')}   NISN: ${escapePrint(st.nisn||'—')}

Kelas: ${escapePrint(st.class||'—')}

Tahun Pelajaran: ${escapePrint(year)}   Semester: ${escapePrint(sem)}

Tempat, tanggal lahir: ${escapePrint(st.birthPlace||st.birthplace||'—')} ${escapePrint(st.birthDate||st.dob||'')}

`).join('')}else{content=`

KEMENTERIAN AGAMA REPUBLIK INDONESIA

${titleMap[type]||titleMap.rapor}

MI Modern Al Azhary


Tahun Pelajaran: ${escapePrint(year)}
Semester: ${escapePrint(sem)}
Kelas: ${escapePrint(cls)}
Tempat, tanggal: ${escapePrint(printSettings.place||'')}, ${formatPrintDate(printSettings.date)}
${type==='rapor'||type==='nilai'||type==='leger'||type==='rekap'?'':''}${list.map((st,i)=>{const subs=['BTA','Hafalan Doa','Mengaji','Hafalan Surat'];const subjects=type==='rapor'||type==='nilai'||type==='leger'||type==='rekap'?subs:[''];return subjects.map((sub,j)=>{const v=sub?(isiValues[isiKey(st,sub)]||{}):{};return `${sub?``:''}`}).join('')}).join('')}
NoNISNISNNama SiswaKelasMata PelajaranNilaiPredikatDeskripsi
${j===0?i+1:''}${j===0?escapePrint(st.nis||'—'):''}${j===0?escapePrint(st.nisn||'—'):''}${j===0?escapePrint(st.name):''}${j===0?escapePrint(st.class||'—'):''}${escapePrint(sub)}${v.score??'—'}${calcIsiPredicate(v.score)||'—'}${escapePrint(v.description||'—')}
${escapePrint(printSettings.place||'')}, ${formatPrintDate(printSettings.date)}
${escapePrint(printSettings.signerTitle||'Kepala Madrasah')}


${escapePrint(printSettings.signer||'................................')}
${escapePrint(printSettings.signerId||'')}
`}renderCetakPreview(area,content,false);area.scrollIntoView({behavior:'smooth',block:'start'});if(typeof notify==='function')notify('success','Pratinjau Disiapkan',`${titleMap[type]||titleMap.rapor}: ${list.length} siswa sudah tampil di halaman. Gunakan Cetak / Simpan PDF bila siap.`)} function cetakExportExcel(){const rows=[['No','NISN','Nama Siswa','L/P','TTL','Kelas','Status']];cetakStudentList().forEach((st,i)=>rows.push([i+1,st.nisn||'',st.name||'',st.gender||st.sex||'',`${st.birthPlace||st.birthplace||''} ${st.birthDate||st.dob||''}`.trim(),st.class||'',cetakStudentReady(st)?'Siap Cetak':'Perlu Diperiksa']));const html=''+rows.map(r=>''+r.map(v=>'').join('')+'').join('')+'
'+escapePrint(v)+'
';const blob=new Blob(['',html],{type:'application/vnd.ms-excel;charset=utf-8;'}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download='daftar-siswa-cetak-rapor.xls';a.click();URL.revokeObjectURL(url);notify?.('success','File Excel Dibuat','Daftar siswa diekspor ke file Excel (.xls).')} function cetakCopyTable(){const text=[...document.querySelectorAll('#cetakStudentTable tr')].map(tr=>[...tr.querySelectorAll('th,td')].slice(1,8).map(td=>td.innerText.trim()).join('\t')).join('\n');if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(text).then(()=>notify?.('success','Tabel Disalin','Data tabel berhasil disalin.')).catch(()=>cetakCopyFallback(text));else cetakCopyFallback(text)} function cetakCopyFallback(text){const ta=document.createElement('textarea');ta.value=text;document.body.appendChild(ta);ta.select();try{document.execCommand('copy');notify?.('success','Tabel Disalin','Data tabel disalin jika izin browser mengizinkan.')}catch(e){notify?.('info','Salin Tabel','Pilih dan salin tabel secara manual.')}ta.remove()} function refreshCetakSummary(){if(typeof previewPrintSettings==='function')previewPrintSettings();const cls=document.getElementById('cetakClass')?.value||'all',year=document.getElementById('cetakYear')?.value||'2026/2027',sem=document.getElementById('cetakSemester')?.value||'Ganjil',n=cetakStudentList().length;const summary=document.getElementById('cetakSummaryText');if(summary)summary.textContent=`Periode ${year} · Semester ${sem} · ${cls==='all'?'Semua kelas':'Kelas '+cls} · ${n} siswa`;const period=document.getElementById('cetakActivePeriod');if(period)period.textContent=year+' · Semester '+sem;} document.addEventListener('DOMContentLoaded',function(){renderCetakStudents();const active=document.getElementById('cetakActivePeriod');if(active){const p=document.querySelector('.period-text,.period-label,[data-active-period]');if(p&&p.textContent.trim())active.textContent=p.textContent.trim()} });