// ==UserScript== // @name ShalaDarpan Attendance Auto Fill (Safe & Dynamic) // @namespace https://rajshaladarpan.rajasthan.gov.in/ // @version 2.2 // @description Auto-fill attendance only when attendance table exists (all schools) // @match https://rajshaladarpan.rajasthan.gov.in/*/Home/School/StudentAttendence.aspx // @grant none // ==/UserScript== (function () { 'use strict'; /**************** FLOATING BUTTON ****************/ const btn = document.createElement('button'); btn.innerText = '⚡ Auto Fill Attendance'; Object.assign(btn.style, { position: 'fixed', bottom: '20px', right: '20px', zIndex: '99999', padding: '12px 16px', backgroundColor: '#28a745', color: '#fff', border: 'none', borderRadius: '6px', cursor: 'pointer', fontSize: '14px', boxShadow: '0 3px 8px rgba(0,0,0,0.3)' }); document.body.appendChild(btn); /**************** HELPERS ****************/ function getSchoolCode() { const lbl = document.getElementById('lblSchcd'); if (!lbl) return null; const span = lbl.querySelector('span'); return span ? span.innerText.trim() : null; } function getSelectText(id) { const el = document.getElementById(id); return el ? el.options[el.selectedIndex]?.text.trim() : ''; } function monthShort(monthText) { const map = { January: 'Jan', February: 'Feb', March: 'Mar', April: 'Apr', May: 'May', June: 'Jun', July: 'Jul', August: 'Aug', September: 'Sep', October: 'Oct', November: 'Nov', December: 'Dec' }; return map[monthText] || monthText; } function attendanceTableExists() { return document.getElementById('ContentPlaceHolder1_footer2_gvattendence'); } /**************** MAIN LOGIC ****************/ btn.addEventListener('click', async () => { // ✅ Check table existence FIRST if (!attendanceTableExists()) { alert('❌ Attendance table not loaded.\nPlease select Class, Section & Month and wait.'); return; } const schoolCode = getSchoolCode(); if (!schoolCode) { alert('❌ School Code (NIC-SD ID) not found'); return; } const classVal = getSelectText('ContentPlaceHolder1_footer2_ddlclass'); const sectionVal = getSelectText('ContentPlaceHolder1_footer2_ddlsection'); const monthText = getSelectText('ContentPlaceHolder1_footer2_ddlmonth'); const monthVal = monthShort(monthText); if (!classVal || !sectionVal || !monthVal) { alert('❌ Please select Class, Section and Month'); return; } const apiUrl = `https://sd.rankguruji.com/api/load_students.php` + `?code=${schoolCode}&class=${classVal}§ion=${sectionVal}&month=${monthVal}`; console.log('📡 Fetching:', apiUrl); try { const res = await fetch(apiUrl); const data = await res.json(); if (!data.students || !data.students.length) { alert('❌ No student data found from API'); return; } // Build SRNO → Days map const studentMap = {}; data.students.forEach(s => { studentMap[s.srno] = s.days; }); // Fill attendance let index = 0; let filled = 0; while (true) { const srnoSpan = document.getElementById( `ContentPlaceHolder1_footer2_gvattendence_lblsrno_${index}` ); const input = document.getElementById( `ContentPlaceHolder1_footer2_gvattendence_txtatt_${index}` ); if (!srnoSpan || !input) break; const srno = srnoSpan.innerText.trim(); if (studentMap[srno] !== undefined) { input.value = studentMap[srno]; input.style.backgroundColor = '#d4edda'; filled++; } else { input.style.backgroundColor = '#f8d7da'; } index++; } alert(`✅ Attendance auto-filled for ${filled} students`); } catch (err) { console.error('❌ Error:', err); alert('❌ Failed to load attendance data'); } }); })();