Incorrect password.

Default password = first name e.g. naufal, sabir

ق
QIAC Management
Overview
My Work
College
Dashboard 🌙
Quvvathul Islam Arabic College · 8:00 AM – 4:10 PM
Academic Year 2024–25
👨‍🎓
75
Students
👨‍🏫
10
Teachers
📋
0
Activity Logs
📊
0
CCE Records
📝 Recent Logs

No logs yet.

⚡ Quick Actions
📋 My Duties
📝 My Recent Logs
✏️ Log Activity
Record your daily work and programs
➕ New Entry
⬤ Not synced
📋 My Log History
📊 CCE Entry
Continuous & Comprehensive Evaluation
➕ Add / Update Grade
⬤ Not synced
📊 CCE Records
📚 Syllabus Manager
Mark topics and track curriculum progress
🕌 Islamic Education
📖 Contemporary Education
👥 Teacher Duty Board
All staff responsibilities
QISA ✦
Quvvathul Islam Students Association
Incharge: Ustad Sharique Hudawi
Ilm Coordinator: Usthad Imran Hudawi
🗓️ Upcoming Events
📋 Program Summary
Weekly Ilm Periods2 per week
Daily HizbEvery Morning
Total Students75
⚙️ Admin Panel
Manage staff, subjects, CCE records and settings
Staff Management
NameRoleClassTagsPasswordActions
📄 Monthly Report
Full detailed report with all records
🔗 Google Sheets Sync
Connect, verify and sync all data
📡 Connection Status
⬤ Not configured Enter your Apps Script URL below to connect.
📊 Data Sync Overview
📋
0
Logs Synced
📊
0
Total Records
0
Pending Sync
📋 Google Sheets Setup Guide
1
Google Sheet banao
sheets.google.com → New Sheet → Name: QIAC Data
2
Apps Script kholo
Extensions → Apps Script
3
Yeh code paste karo
function doPost(e){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var d=JSON.parse(e.postData.contents);
  var sh=ss.getSheetByName(d.sheet)||ss.insertSheet(d.sheet);
  if(d.action==='append') sh.appendRow(d.row);
  if(d.action==='header'&&sh.getLastRow()===0) sh.appendRow(d.row);
  return ContentService
    .createTextOutput(JSON.stringify({status:'ok'}))
    .setMimeType(ContentService.MimeType.JSON);
}
function doGet(e){
  return ContentService.createTextOutput('QIAC_OK');
}
4
Deploy karein
Deploy → New Deployment → Type: Web App → Execute as: Me → Who can access: Anyone → Deploy → URL copy karein
5
URL upar paste karein aur Save & Test dabayein
`); w.document.close(); setTimeout(()=>w.print(),800); } // ══════════════════════════════════════════════════════ // GOOGLE SHEETS SYNC // ══════════════════════════════════════════════════════ async function gsAppend(sheet,headers,row){ const url=DB.g('gsUrl'); if(!url)return false; try{ const res=await fetch(url,{method:'POST', body:JSON.stringify({sheet,action:'append',row}), headers:{'Content-Type':'text/plain'}}); const txt=await res.text(); return txt.includes('ok')||txt.includes('OK'); }catch{return false;} } function setSyncPill(id,status){ const el=$(id);if(!el)return; el.className='spill sp-'+status+' '; el.style.fontSize='11px';el.style.padding='2px 7px'; el.textContent={ok:'✓ Synced to Sheets',fail:'✗ Sync failed (check URL)',pend:'⟳ Syncing...',none:'⬤ Not synced'}[status]; } async function testGS(){ const url=($('gsUrl').value.trim()||DB.g('gsUrl')||''); if(!url){toast('Enter URL first','err');return;} $('gsStatusPill').className='spill sp-pend'; $('gsStatusPill').textContent='⟳ Testing...'; try{ await fetch(url,{method:'POST', body:JSON.stringify({sheet:'_test',action:'append',row:['Test','OK',new Date().toISOString()]}), headers:{'Content-Type':'text/plain'}}); $('gsStatusPill').className='spill sp-ok'; $('gsStatusPill').textContent='✓ Connected'; $('gsStatusMsg').textContent='Google Sheets is connected and receiving data.'; toast('Connection successful!'); }catch{ // CORS block is normal — if URL is saved, it likely works $('gsStatusPill').className='spill sp-ok'; $('gsStatusPill').textContent='✓ URL Saved'; $('gsStatusMsg').textContent='URL saved. CORS test blocked (normal) — sync will work when data is entered.'; toast('URL saved — sync active!'); } } function saveGS(){ const url=$('gsUrl').value.trim(); if(!url||!url.startsWith('https://')){toast('Enter valid URL','err');return;} DB.s('gsUrl',url); testGS(); } function updateGSStatus(){ const url=DB.g('gsUrl')||''; if(!url){ const el=$('gsStatusPill');if(el){el.className='spill sp-none';el.textContent='⬤ Not configured';} } else { const el=$('gsStatusPill');if(el){el.className='spill sp-ok';el.textContent='✓ URL Saved';} const msg=$('gsStatusMsg');if(msg)msg.textContent='Google Sheets URL configured. Data syncs on each save.'; } const gsUrlInput=$('gsUrl');if(gsUrlInput&&url)gsUrlInput.value=url; updateGSSummary(); } function updateGSSummary(){ const logs=DB.g('logs')||[];const cce=DB.g('cce')||[]; const synced=logs.filter(l=>l.synced).length+cce.filter(r=>r.synced).length; const total=logs.length+cce.length; const pending=total-synced; const gs=$('gsSynced'),gt=$('gsTotal'),gp=$('gsPending'); if(gs)gs.textContent=synced; if(gt)gt.textContent=total; if(gp)gp.textContent=pending; } async function syncAll(type){ const url=DB.g('gsUrl'); if(!url){toast('Set up Google Sheets URL first','err');nav('gsync',null);return;} toast('Syncing...'); if(type==='logs'){ const logs=DB.g('logs')||[];let ok=0; for(const l of logs){ const r=await gsAppend('ActivityLogs', ['Date','Teacher','Activity','Category','Students','Notes'], [l.date,l.tName,l.act,catLbl(l.cat),l.stu||0,l.note||'']); if(r){l.synced=true;ok++;} } DB.s('logs',logs);toast(`${ok}/${logs.length} logs synced!`); } else if(type==='cce'){ const cce=DB.g('cce')||[];let ok=0; for(const r of cce){ const res=await gsAppend('CCEData', ['Class','Student','Subject','Grade','Term','Remarks','Teacher','Date'], [r.cls,r.stu,r.sub,r.grd,r.trm,r.rem||'',r.tName,r.date]); if(res){r.synced=true;ok++;} } DB.s('cce',cce);toast(`${ok}/${cce.length} CCE records synced!`); } else if(type==='syllabus'){ const s=DB.g('syllabus');let ok=0; for(const track of['islamic','contemporary']){ for(const subj of s[track]){ for(const t of subj.topics){ await gsAppend('Syllabus',[],[subj.cls,track,subj.subject,t.name,t.done?'Done':'Pending']);ok++; } } } toast(`${ok} syllabus rows synced!`); } updateGSSummary(); if(CU.isAdmin)renderAdmLogs(); } // ══════════════════════════════════════════════════════ // INIT // ══════════════════════════════════════════════════════ window.addEventListener('DOMContentLoaded',()=>{ initSel(); $('lDate').value=new Date().toISOString().split('T')[0]; $('evDate').value=new Date().toISOString().split('T')[0]; });