// ==UserScript== // @name ShalaDarpan Attendance Auto Fill // @namespace https://rajshaladarpan.rajasthan.gov.in/ // @version 2.0 // @description Fetch attendance from API and auto-fill table by matching SRNO // @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: '9999', 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 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', Jun: 'Jun', July: 'Jul', August: 'Aug', September: 'Sep', October: 'Oct', Novermber: 'Nov', December: 'Dec' }; return map[monthText] || monthText; } // ---------- Main Logic ---------- btn.addEventListener('click', async () => { const schoolCode = '219069'; // 🔴 change if needed const classVal = getSelectText('ContentPlaceHolder1_footer2_ddlclass'); const sectionVal = getSelectText('ContentPlaceHolder1_footer2_ddlsection'); const monthText = getSelectText('ContentPlaceHolder1_footer2_ddlmonth'); const monthVal = monthShort(monthText); 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(); console.log('✅ API Response:', data); if (!data.students || !data.students.length) { alert('No student data found'); return; } // Create lookup map: srno -> days const studentMap = {}; data.students.forEach(s => { studentMap[s.srno] = s.days; }); // ---------- Fill Table ---------- let index = 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'; console.log(`✔ Filled SRNO ${srno} → ${studentMap[srno]}`); } else { input.style.backgroundColor = '#f8d7da'; console.warn(`✖ No data for SRNO ${srno}`); } index++; } alert('Attendance auto-filled successfully 🎉'); } catch (err) { console.error('❌ Error:', err); alert('Failed to load attendance data'); } }); })();