#166

Open
opened 2025-09-15 15:09:24 -04:00 by semskgcphs-afk · 0 comments
semskgcphs-afk commented 2025-09-15 15:09:24 -04:00 (Migrated from github.com)
<html lang="bn"> <head>
<!DOCTYPE html> <html lang="bn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম ২০২৬</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; background: #f5f5f5; padding: 20px; } .container { max-width: 1200px; margin: 0 auto; background: white; border-radius: 10px; box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .header { background: #2196F3; color: white; padding: 20px; text-align: center; border-radius: 10px 10px 0 0; } .nav-menu { background: #1976D2; padding: 10px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; } .nav-btn { background: transparent; color: white; border: 2px solid white; padding: 10px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; } .nav-btn:hover, .nav-btn.active { background: white; color: #1976D2; } .content { padding: 20px; } .tab-content { display: none; } .tab-content.active { display: block; } .form-section { background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #2196F3; } .form-section h3 { color: #2196F3; margin-bottom: 15px; } .form-group { margin-bottom: 15px; } .form-group label { display: block; margin-bottom: 5px; font-weight: bold; color: #555; } .form-row { display: grid; grid-template-columns: 2fr 1fr 1fr 80px 50px; gap: 10px; align-items: center; margin-bottom: 10px; padding: 10px; background: white; border-radius: 5px; } .form-row select, .form-row input { padding: 8px; border: 2px solid #ddd; border-radius: 5px; } .student-count { background: #28a745; color: white; text-align: center; border-radius: 5px; font-weight: bold; padding: 8px 5px; } .btn { background: #2196F3; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; font-weight: bold; margin: 5px; } .btn:hover { background: #1976D2; } .btn-success { background: #28a745; } .btn-success:hover { background: #218838; } .btn-danger { background: #dc3545; } .btn-danger:hover { background: #c82333; } .remove-btn { background: #dc3545; color: white; border: none; padding: 5px 8px; border-radius: 3px; cursor: pointer; } .seat-table { width: 100%; border-collapse: collapse; margin: 20px 0; } .seat-table th, .seat-table td { border: 1px solid #ddd; padding: 8px; text-align: center; } .seat-table th { background: #2196F3; color: white; } .seat-table tr:nth-child(even) { background: #f8f9fa; } .alert { padding: 10px; margin: 10px 0; border-radius: 5px; display: none; } .alert-success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .alert-error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .total-students { background: #dc3545; color: white; padding: 15px; border-radius: 5px; text-align: center; margin: 20px 0; font-weight: bold; font-size: 18px; } .column-input { background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #ddd; } .column-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .range-item { display: flex; gap: 10px; align-items: center; margin-bottom: 10px; padding: 10px; background: white; border-radius: 5px; } .range-item input { width: 80px; padding: 5px; border: 1px solid #ddd; border-radius: 3px; text-align: center; } @media (max-width: 768px) { .form-row { grid-template-columns: 1fr; gap: 10px; } .nav-menu { flex-direction: column; } .range-item { flex-direction: column; align-items: stretch; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম ২০২৬</h1> <p>সিট প্ল্যান ও কক্ষ তথ্য ব্যবস্থাপনা</p> </div> <div class="nav-menu"> <button class="nav-btn active" onclick="showTab('room-info')">কক্ষের তথ্য</button> <button class="nav-btn" onclick="showTab('seat-generator')">সিট প্ল্যান জেনারেটর</button> <button class="nav-btn" onclick="showTab('view-results')">ফলাফল দেখুন</button> <button class="nav-btn" onclick="showTab('export')">এক্সপোর্ট</button> </div> <div class="content"> <!-- Room Info Tab --> <div id="room-info" class="tab-content active"> <div class="form-section"> <h3>কক্ষের তথ্য</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 20px;"> <div> <label>কক্ষ নং:</label> <select id="roomSelect"> <option value="1-boys">কক্ষ ১ (বালক)</option> <option value="1-girls">কক্ষ ১ (বালিকা)</option> <option value="1-mixed">কক্ষ ১ (বালক ও বালিকা)</option> <option value="2-boys">কক্ষ ২ (বালক)</option> <option value="2-girls">কক্ষ ২ (বালিকা)</option> <option value="2-mixed">কক্ষ ২ (বালক ও বালিকা)</option> <option value="3-boys">কক্ষ ৩ (বালক)</option> <option value="3-girls">কক্ষ ৩ (বালিকা)</option> <option value="3-mixed">কক্ষ ৩ (বালক ও বালিকা)</option> </select> </div> <div> <label>বিভাগ:</label> <select id="departmentSelect"> <option value="বিজ্ঞান">বিজ্ঞান</option> <option value="মানবিক">মানবিক</option> <option value="ব্যবসায় শিক্ষা">ব্যবসায় শিক্ষা</option> </select> </div> <div> <label>ভবন:</label> <select id="buildingSelect"> <option value="পশ্চিম পার্শ্বের ভবন">পশ্চিম পার্শ্বের ভবন</option> <option value="পূর্ব পার্শ্বের ভবন">পূর্ব পার্শ্বের ভবন</option> <option value="প্রধান ভবন">প্রধান ভবন</option> </select> </div> <div> <label>তলা:</label> <select id="floorSelect"> <option value="১ম তলা">১ম তলা</option> <option value="২য় তলা" selected>২য় তলা</option> <option value="৩য় তলা">৩য় তলা</option> </select> </div> </div> </div> <div class="form-section"> <h3>বিদ্যালয়ের তথ্য</h3> <div id="schoolForms"> <div class="form-row"> <select class="school-select"> <option value="">বিদ্যালয় নির্বাচন করুন</option> <option value="এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়">এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়</option> <option value="ঢাকা কলেজিয়েট স্কুল">ঢাকা কলেজিয়েট স্কুল</option> <option value="হলি ক্রস স্কুল">হলি ক্রস স্কুল</option> <option value="ভিকারুননিসা নূন স্কুল">ভিকারুননিসা নূন স্কুল</option> </select> <input type="number" placeholder="শুরুর রোল" class="start-roll" min="1"> <input type="number" placeholder="শেষের রোল" class="end-roll" min="1"> <div class="student-count">০</div> <button type="button" class="remove-btn" onclick="removeSchoolRow(this)">×</button> </div> </div> <button type="button" class="btn btn-success" onclick="addSchoolRow()">+ নতুন বিদ্যালয় যোগ করুন</button> <div class="total-students" id="totalStudents">মোট পরীক্ষার্থী: ০ জন</div> </div> </div> <!-- Seat Generator Tab --> <div id="seat-generator" class="tab-content"> <div class="alert alert-success" id="successAlert"></div> <div class="alert alert-error" id="errorAlert"></div> <div class="form-section"> <h3>সিট প্ল্যান জেনারেটর</h3> <div id="columnInputs"></div> <button type="button" class="btn" onclick="generateSeatPlan()">সিট প্ল্যান তৈরি করুন</button> <button type="button" class="btn btn-danger" onclick="clearSeatPlan()">ক্লিয়ার করুন</button> </div> </div> <!-- View Results Tab --> <div id="view-results" class="tab-content"> <div id="resultsDisplay"> <p style="text-align: center; padding: 50px; color: #666;">এখনো কোন ফলাফল তৈরি হয়নি।</p> </div> </div> <!-- Export Tab --> <div id="export" class="tab-content"> <div class="form-section"> <h3>এক্সপোর্ট অপশন</h3> <div style="text-align: center; margin-bottom: 20px;"> <button type="button" class="btn btn-success" onclick="exportToCSV()">CSV ডাউনলোড</button> <button type="button" class="btn" onclick="openGoogleSheets()">Google Sheets খুলুন</button> <button type="button" class="btn" onclick="copyRoomInfoForD10()">D10 এর জন্য তথ্য কপি</button> <button type="button" class="btn" onclick="copyData()">সিট প্ল্যান কপি</button> <button type="button" class="btn btn-success" id="submitToSheetsBtn" onclick="submitToGoogleSheets()" disabled> API লোড হচ্ছে... </button> <button type="button" class="btn" onclick="testSheetsConnection()">সংযোগ টেস্ট</button> </div> <div style="background: #ffebee; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #f44336;"> <h4 style="color: #c62828;">⚠️ Google Sheets API সেটআপ প্রয়োজন:</h4> <ol style="margin-left: 20px; line-height: 1.8; color: #d32f2f;"> <li><strong>Google Cloud Console এ যান:</strong> <a href="https://console.cloud.google.com/" target="_blank">console.cloud.google.com</a></li> <li><strong>নতুন প্রজেক্ট তৈরি করুন</strong> অথবা বিদ্যমান সিলেক্ট করুন</li> <li><strong>Google Sheets API Enable করুন:</strong> APIs & Services → Library → Google Sheets API → Enable</li> <li><strong>API Key তৈরি করুন:</strong> Credentials → Create Credentials → API Key</li> <li><strong>API Key কোডে প্রবেশ করান:</strong> <code>const API_KEY = 'YOUR_API_KEY_HERE';</code> লাইনে</li> <li><strong>OAuth 2.0 সেটআপ করুন</strong> (write access এর জন্য)</li> </ol> <p style="margin-top: 15px; padding: 10px; background: #fff; border-radius: 5px; color: #666;"> <strong>বিকল্প:</strong> আপাতত manual copy/paste পদ্ধতি ব্যবহার করুন যা 100% কার্যকর। </p> </div> <div style="background: #e8f5e8; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #4CAF50;"> <h4>সরাসরি জমা দেওয়ার অপশন:</h4> <p style="margin: 10px 0;"> <strong>Google Form Link:</strong> <a href="#" id="googleFormLink" target="_blank">Data Submission Form</a> </p> <div id="formSubmissionStatus" style="margin-top: 10px; padding: 10px; display: none;"></div> </div> <div style="background: #e3f2fd; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h4>Google Sheets Integration (Data_Input শিট):</h4> <p style="margin: 10px 0;"> <strong>Main Link:</strong> <a href="https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit?usp=sharing" target="_blank"> Google Sheets Document </a> </p> <p style="margin: 10px 0;"> <strong>Data_Input শিট সরাসরি:</strong> <a href="https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit#gid=0" target="_blank"> Data_Input Sheet </a> </p> </div> <div style="background: #fff3e0; padding: 15px; border-radius: 8px; border-left: 4px solid #FF9800;"> <h4>তিনটি জমা দেওয়ার পদ্ধতি:</h4> <div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;"> <h5 style="color: #4CAF50;">পদ্ধতি ১: Google Form (সুপারিশকৃত)</h5> <ol style="margin-left: 20px; line-height: 1.6;"> <li>"Google Form এ জমা দিন" বাটনে ক্লিক করুন</li> <li>ফর্মটি অটোমেটিক পূরণ হয়ে যাবে</li> <li>"Submit" বাটনে ক্লিক করুন</li> <li>ডেটা সরাসরি Google Sheets এ চলে যাবে</li> </ol> </div> <div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;"> <h5 style="color: #2196F3;">পদ্ধতি ২: Manual Copy (D10 সেল)</h5> <ol style="margin-left: 20px; line-height: 1.6;"> <li>"D10 এর জন্য তথ্য কপি" বাটনে ক্লিক করুন</li> <li>"Data_Input Sheet" লিংকে ক্লিক করুন</li> <li>D10 সেল সিলেক্ট করুন</li> <li>Ctrl+V দিয়ে পেস্ট করুন</li> </ol> </div> <div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;"> <h5 style="color: #FF9800;">পদ্ধতি ৩: CSV Import</h5> <ol style="margin-left: 20px; line-height: 1.6;"> <li>CSV ডাউনলোড করুন</li> <li>Google Sheets এ নতুন শিট তৈরি করুন</li> <li>File → Import → Upload দিয়ে CSV ইমপোর্ট করুন</li> </ol> </div> </div> </div> </div> </div> </div> <script src="https://apis.google.com/js/api.js"></script> <script> let rangeCounters = {}; let seatPlanData = null; // Google Sheets API Configuration const API_KEY = 'YOUR_API_KEY_HERE'; // Replace with your actual API key const SHEET_ID = '1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA'; const DISCOVERY_DOC = 'https://sheets.googleapis.com/$discovery/rest?version=v4'; const SCOPES = 'https://www.googleapis.com/auth/spreadsheets'; let gapi_loaded = false; let gis_loaded = false; // Initialize Google API function gapiLoaded() { gapi.load('client', initializeGapiClient); } async function initializeGapiClient() { try { await gapi.client.init({ apiKey: API_KEY, discoveryDocs: [DISCOVERY_DOC], }); gapi_loaded = true; maybeEnableButtons(); } catch (error) { console.log('GAPI initialization error:', error); } } function gisLoaded() { gis_loaded = true; maybeEnableButtons(); } function maybeEnableButtons() { if (gapi_loaded && gis_loaded) { document.getElementById('submitToSheetsBtn').disabled = false; document.getElementById('submitToSheetsBtn').textContent = 'Google Sheets এ জমা দিন'; } } // Initialize document.addEventListener('DOMContentLoaded', function() { initializeSeatGenerator(); setupEventListeners(); // Load Google API if (typeof gapi !== 'undefined') { gapiLoaded(); } }); async function submitToGoogleSheets() { if (!gapi_loaded) { alert('Google API লোড হয়নি। দয়া করে পেজ রিফ্রেশ করুন।'); return; } try { // Get room info const roomSelect = document.getElementById('roomSelect').value; const department = document.getElementById('departmentSelect').value; const building = document.getElementById('buildingSelect').value; const floor = document.getElementById('floorSelect').value; // Format room info const roomNumber = roomSelect.split('-')[0]; const roomType = roomSelect.split('-')[1]; const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা'; // Get total students let totalStudents = 0; document.querySelectorAll('#schoolForms .form-row').forEach(row => { const school = row.querySelector('.school-select').value; const start = parseInt(row.querySelector('.start-roll').value) || 0; const end = parseInt(row.querySelector('.end-roll').value) || 0; if (school && start > 0 && end >= start) { totalStudents += end - start + 1; } }); const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`; // Submit room info to D10 await submitRoomInfoToD10(roomInfo); // Submit seat plan if available if (seatPlanData && seatPlanData.length > 0) { await submitSeatPlanToNewSheet(roomSelect, seatPlanData); } showAlert('সফলভাবে Google Sheets এ জমা দেওয়া হয়েছে!', 'success'); } catch (error) { console.error('Submission error:', error); showAlert('জমা দিতে ত্রুটি হয়েছে: ' + error.message, 'error'); } } async function submitRoomInfoToD10(roomInfo) { const values = [[roomInfo]]; const range = 'Data_Input!D10'; const request = { spreadsheetId: SHEET_ID, range: range, valueInputOption: 'USER_ENTERED', resource: { values: values } }; const response = await gapi.client.sheets.spreadsheets.values.update(request); console.log('Room info submitted to D10:', response); } async function submitSeatPlanToNewSheet(roomSelect, seatData) { const sheetName = `Room_${roomSelect}`; // Try to create new sheet (ignore error if sheet already exists) try { await createNewSheet(sheetName); } catch (error) { console.log('Sheet might already exist, continuing...'); } // Prepare data for the sheet const allColumns = ['C', 'D', 'F', 'G', 'I', 'J']; const maxRows = Math.max(...seatData.map(col => col.rolls.length)); const sheetData = []; // Header row sheetData.push(['Row', 'কলাম C', 'কলাম D', 'কলাম F', 'কলাম G', 'কলাম I', 'কলাম J']); // Row 24 with column headers sheetData.push([24, 'কলাম C', 'কলাম D', 'কলাম F', 'কলাম G', 'কলাম I', 'কলাম J']); // Data rows for (let row = 0; row < maxRows; row++) { const rowData = [25 + row]; allColumns.forEach(col => { const colData = seatData.find(c => c.column === col); const value = colData && row < colData.rolls.length ? colData.rolls[row] : ''; rowData.push(value); }); sheetData.push(rowData); } // Submit data to the sheet const range = `${sheetName}!A1`; const request = { spreadsheetId: SHEET_ID, range: range, valueInputOption: 'USER_ENTERED', resource: { values: sheetData } }; const response = await gapi.client.sheets.spreadsheets.values.update(request); console.log('Seat plan submitted to new sheet:', response); } async function createNewSheet(sheetName) { const request = { spreadsheetId: SHEET_ID, resource: { requests: [{ addSheet: { properties: { title: sheetName } } }] } }; const response = await gapi.client.sheets.spreadsheets.batchUpdate(request); console.log('New sheet created:', response); } // Test connection function async function testSheetsConnection() { try { const response = await gapi.client.sheets.spreadsheets.get({ spreadsheetId: SHEET_ID }); showAlert('Google Sheets সংযোগ সফল!', 'success'); console.log('Sheets connection successful:', response); } catch (error) { showAlert('Google Sheets সংযোগ ব্যর্থ: ' + error.message, 'error'); console.error('Sheets connection failed:', error); } } // Initialize document.addEventListener('DOMContentLoaded', function() { initializeSeatGenerator(); setupEventListeners(); }); function showTab(tabName) { // Hide all tabs document.querySelectorAll('.tab-content').forEach(tab => { tab.classList.remove('active'); }); // Remove active from buttons document.querySelectorAll('.nav-btn').forEach(btn => { btn.classList.remove('active'); }); // Show selected tab document.getElementById(tabName).classList.add('active'); event.target.classList.add('active'); } function setupEventListeners() { document.querySelectorAll('.start-roll, .end-roll').forEach(input => { input.addEventListener('input', updateStudentCounts); }); document.querySelectorAll('.school-select').forEach(select => { select.addEventListener('change', updateStudentCounts); }); } function addSchoolRow() { const container = document.getElementById('schoolForms'); const newRow = document.createElement('div'); newRow.className = 'form-row'; newRow.innerHTML = ` <select class="school-select"> <option value="">বিদ্যালয় নির্বাচন করুন</option> <option value="এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়">এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়</option> <option value="ঢাকা কলেজিয়েট স্কুল">ঢাকা কলেজিয়েট স্কুল</option> <option value="হলি ক্রস স্কুল">হলি ক্রস স্কুল</option> <option value="ভিকারুননিসা নূন স্কুল">ভিকারুননিসা নূন স্কুল</option> </select> <input type="number" placeholder="শুরুর রোল" class="start-roll" min="1"> <input type="number" placeholder="শেষের রোল" class="end-roll" min="1"> <div class="student-count">০</div> <button type="button" class="remove-btn" onclick="removeSchoolRow(this)">×</button> `; container.appendChild(newRow); // Add event listeners to new elements newRow.querySelector('.start-roll').addEventListener('input', updateStudentCounts); newRow.querySelector('.end-roll').addEventListener('input', updateStudentCounts); newRow.querySelector('.school-select').addEventListener('change', updateStudentCounts); } function removeSchoolRow(button) { button.parentElement.remove(); updateStudentCounts(); } function updateStudentCounts() { let total = 0; document.querySelectorAll('#schoolForms .form-row').forEach(row => { const school = row.querySelector('.school-select').value; const start = parseInt(row.querySelector('.start-roll').value) || 0; const end = parseInt(row.querySelector('.end-roll').value) || 0; let count = 0; if (school && start > 0 && end >= start) { count = end - start + 1; } row.querySelector('.student-count').textContent = count; total += count; }); document.getElementById('totalStudents').textContent = `মোট পরীক্ষার্থী: ${total} জন`; } function initializeSeatGenerator() { const columns = ['C', 'D', 'F', 'G', 'I', 'J']; const container = document.getElementById('columnInputs'); columns.forEach(col => { rangeCounters[col] = 1; const div = document.createElement('div'); div.className = 'column-input'; div.innerHTML = ` <div class="column-header"> <strong>কলাম ${col}</strong> <button type="button" class="btn" onclick="addRange('${col}')">+ রেঞ্জ যোগ করুন</button> </div> <div id="ranges_${col}"></div> `; container.appendChild(div); addRange(col); }); } function addRange(col) { const container = document.getElementById('ranges_' + col); const rangeDiv = document.createElement('div'); rangeDiv.className = 'range-item'; rangeDiv.id = 'range_' + col + '_' + rangeCounters[col]; rangeDiv.innerHTML = ` <span>রেঞ্জ ${container.children.length + 1}:</span> <span>শুরু:</span> <input type="number" value="1" min="0" /> <span>সংখ্যা:</span> <input type="number" value="0" min="0" /> <button type="button" class="remove-btn" onclick="removeRange('${col}', '${rangeCounters[col]}')">×</button> `; container.appendChild(rangeDiv); rangeCounters[col]++; } function removeRange(col, id) { const container = document.getElementById('ranges_' + col); if (container.children.length > 1) { document.getElementById('range_' + col + '_' + id).remove(); } } function generateSeatPlan() { const columns = ['C', 'D', 'F', 'G', 'I', 'J']; const seatData = []; columns.forEach(col => { const ranges = document.querySelectorAll('#ranges_' + col + ' .range-item'); const colRolls = []; ranges.forEach(range => { const inputs = range.querySelectorAll('input'); const start = parseInt(inputs[0].value) || 0; const count = parseInt(inputs[1].value) || 0; for (let i = 0; i < count; i++) { colRolls.push(start + i); } }); if (colRolls.length > 0) { colRolls.sort((a, b) => a - b); seatData.push({ column: col, rolls: colRolls }); } }); if (seatData.length === 0) { showAlert('কোন ডেটা পাওয়া যায়নি!', 'error'); return; } seatPlanData = seatData; displayResults(seatData); showAlert('সিট প্ল্যান তৈরি হয়েছে!', 'success'); } function displayResults(data) { const maxRows = Math.max(...data.map(col => col.rolls.length)); const allColumns = ['C', 'D', 'F', 'G', 'I', 'J']; let html = ` <h3>সিট প্ল্যান ফলাফল</h3> <table class="seat-table"> <thead> <tr> <th>Row</th> ${allColumns.map(col => `<th>কলাম ${col}</th>`).join('')} </tr> </thead> <tbody> <tr> <td><strong>24</strong></td> ${allColumns.map(col => `<td><strong>কলাম ${col}</strong></td>`).join('')} </tr> `; for (let row = 0; row < maxRows; row++) { html += `<tr><td><strong>${25 + row}</strong></td>`; allColumns.forEach(col => { const colData = data.find(c => c.column === col); const value = colData && row < colData.rolls.length ? colData.rolls[row] : ''; html += `<td>${value}</td>`; }); html += '</tr>'; } html += '</tbody></table>'; document.getElementById('resultsDisplay').innerHTML = html; } function clearSeatPlan() { if (confirm('সব ডেটা মুছে ফেলবেন?')) { document.getElementById('columnInputs').innerHTML = ''; initializeSeatGenerator(); document.getElementById('resultsDisplay').innerHTML = '<p style="text-align: center; padding: 50px; color: #666;">এখনো কোন ফলাফল তৈরি হয়নি।</p>'; seatPlanData = null; showAlert('ডেটা মুছে ফেলা হয়েছে।', 'success'); } } function exportToCSV() { if (!seatPlanData) { alert('প্রথমে সিট প্ল্যান তৈরি করুন!'); return; } const roomInfo = document.getElementById('roomSelect').value; const allColumns = ['C', 'D', 'F', 'G', 'I', 'J']; const maxRows = Math.max(...seatPlanData.map(col => col.rolls.length)); // CSV content with exact format: Row 24, কলাম C, কলাম D, কলাম F, কলাম G, কলাম I, কলাম J let csvContent = ''; // Header row csvContent += 'Row,কলাম C,কলাম D,কলাম F,কলাম G,কলাম I,কলাম J\n'; // Row 24 with column headers csvContent += '24,কলাম C,কলাম D,কলাম F,কলাম G,কলাম I,কলাম J\n'; // Data rows starting from 25 for (let row = 0; row < maxRows; row++) { const rowData = [25 + row]; allColumns.forEach(col => { const colData = seatPlanData.find(c => c.column === col); const value = colData && row < colData.rolls.length ? colData.rolls[row] : ''; rowData.push(value); }); csvContent += rowData.join(',') + '\n'; } const blob = new Blob(['\uFEFF' + csvContent], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `Room_${roomInfo}_seat_plan.csv`; a.click(); URL.revokeObjectURL(url); showAlert('CSV ফাইল ডাউনলোড হয়েছে!', 'success'); } function submitToGoogleForm() { const roomSelect = document.getElementById('roomSelect').value; const department = document.getElementById('departmentSelect').value; const building = document.getElementById('buildingSelect').value; const floor = document.getElementById('floorSelect').value; // Get school information const schoolData = []; let totalStudents = 0; document.querySelectorAll('#schoolForms .form-row').forEach(row => { const school = row.querySelector('.school-select').value; const start = parseInt(row.querySelector('.start-roll').value) || 0; const end = parseInt(row.querySelector('.end-roll').value) || 0; if (school && start > 0 && end >= start) { const count = end - start + 1; totalStudents += count; schoolData.push(`${school}: ${start}-${end} (${count} জন)`); } }); // Format room info const roomNumber = roomSelect.split('-')[0]; const roomType = roomSelect.split('-')[1]; const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা'; const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`; // Create Google Form URL with pre-filled data // Note: You need to create a Google Form and get the actual form ID and field IDs const formBaseURL = 'https://docs.google.com/forms/d/e/YOUR_FORM_ID/viewform'; // For demonstration, create a mailto link or show instructions const formData = { roomInfo: roomInfo, schools: schoolData.join('\n'), seatPlan: seatPlanData ? 'সিট প্ল্যান তৈরি হয়েছে' : 'সিট প্ল্যান তৈরি হয়নি', timestamp: new Date().toLocaleString('bn-BD') }; // Show submission modal/instructions showSubmissionModal(formData); } function showSubmissionModal(data) { const modal = document.createElement('div'); modal.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); display: flex; justify-content: center; align-items: center; z-index: 1000; `; modal.innerHTML = ` <div style="background: white; padding: 30px; border-radius: 10px; max-width: 600px; max-height: 80%; overflow-y: auto;"> <h3 style="color: #2196F3; margin-bottom: 20px;">ডেটা জমা দেওয়ার জন্য প্রস্তুত</h3> <div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <h4>কক্ষের তথ্য:</h4> <p style="margin: 10px 0; font-weight: bold;">${data.roomInfo}</p> <h4>বিদ্যালয়ের তথ্য:</h4> <pre style="background: white; padding: 10px; border-radius: 5px; font-family: inherit;">${data.schools}</pre> <h4>সিট প্ল্যান স্ট্যাটাস:</h4> <p>${data.seatPlan}</p> <p style="margin-top: 15px; color: #666; font-size: 14px;">তৈরি: ${data.timestamp}</p> </div> <div style="background: #e8f5e8; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <h4 style="color: #2e7d32;">জমা দেওয়ার অপশন:</h4> <button onclick="copyAllDataForSubmission('${btoa(JSON.stringify(data))}')" class="btn btn-success" style="margin: 5px;">সব তথ্য কপি করুন</button> <button onclick="emailSubmission('${btoa(JSON.stringify(data))}')" class="btn" style="margin: 5px;">ইমেইল করুন</button> <button onclick="createGoogleForm()" class="btn" style="margin: 5px;">Google Form তৈরি করুন</button> </div> <div style="text-align: center;"> <button onclick="this.parentElement.parentElement.parentElement.remove()" class="btn btn-danger">বন্ধ করুন</button> </div> </div> `; document.body.appendChild(modal); } function copyAllDataForSubmission(encodedData) { const data = JSON.parse(atob(encodedData)); const submissionText = ` একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম - ডেটা জমা ============================================= কক্ষের তথ্য: ${data.roomInfo} বিদ্যালয়ের বিস্তারিত তথ্য: ${data.schools} সিট প্ল্যান: ${data.seatPlan} জমা দেওয়ার সময়: ${data.timestamp} =========================================== এই তথ্য Google Sheets এর Data_Input শিটের D10 সেলে পেস্ট করুন। `; navigator.clipboard.writeText(submissionText).then(() => { alert('সম্পূর্ণ তথ্য কপি করা হয়েছে! এখন Google Sheets এ পেস্ট করুন।'); }).catch(() => { const textArea = document.createElement('textarea'); textArea.value = submissionText; document.body.appendChild(textArea); textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); alert('সম্পূর্ণ তথ্য কপি করা হয়েছে!'); }); } function emailSubmission(encodedData) { const data = JSON.parse(atob(encodedData)); const subject = `পরীক্ষা কক্ষের তথ্য - ${data.roomInfo.split(' - ')[0]}`; const body = `একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম - ডেটা জমা কক্ষের তথ্য: ${data.roomInfo} বিদ্যালয়ের তথ্য: ${data.schools} সিট প্ল্যান: ${data.seatPlan} জমা দেওয়ার সময়: ${data.timestamp}`; const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; window.open(mailtoLink); } function createGoogleForm() { alert(`Google Form তৈরি করতে: 1. https://forms.google.com এ যান 2. নতুন ফর্ম তৈরি করুন 3. এই ফিল্ডগুলো যোগ করুন: - কক্ষের তথ্য (Short answer) - বিদ্যালয়ের তথ্য (Paragraph) - সিট প্ল্যান স্ট্যাটাস (Short answer) - জমা দেওয়ার সময় (Short answer) 4. Form responses কে আপনার Google Sheets এর সাথে connect করুন 5. Form এর ID দিয়ে কোডে আপডেট করুন`); } function copyRoomInfoForD10() { const roomSelect = document.getElementById('roomSelect').value; const department = document.getElementById('departmentSelect').value; const building = document.getElementById('buildingSelect').value; const floor = document.getElementById('floorSelect').value; // Get total students count let totalStudents = 0; document.querySelectorAll('#schoolForms .form-row').forEach(row => { const school = row.querySelector('.school-select').value; const start = parseInt(row.querySelector('.start-roll').value) || 0; const end = parseInt(row.querySelector('.end-roll').value) || 0; if (school && start > 0 && end >= start) { totalStudents += end - start + 1; } }); // Format room info for D10 cell const roomNumber = roomSelect.split('-')[0]; const roomType = roomSelect.split('-')[1]; const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা'; const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`; // Copy to clipboard navigator.clipboard.writeText(roomInfo).then(() => { alert('কক্ষের তথ্য কপি করা হয়েছে! এখন Google Sheets এর Data_Input শিটে গিয়ে D10 সেলে পেস্ট করুন।'); }).catch(() => { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = roomInfo; document.body.appendChild(textArea); textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); alert('কক্ষের তথ্য কপি করা হয়েছে! এখন Google Sheets এর Data_Input শিটে গিয়ে D10 সেলে পেস্ট করুন।'); }); } function openGoogleSheets() { window.open('https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit?usp=sharing', '_blank'); } function copyData() { if (!seatPlanData) { alert('প্রথমে সিট প্ল্যান তৈরি করুন!'); return; } const allColumns = ['C', 'D', 'F', 'G', 'I', 'J']; const maxRows = Math.max(...seatPlanData.map(col => col.rolls.length)); // Create tab-separated text for easy pasting into Google Sheets let textContent = ''; // Header row textContent += 'Row\tকলাম C\tকলাম D\tকলাম F\tকলাম G\tকলাম I\tকলাম J\n'; // Row 24 with headers textContent += '24\tকলাম C\tকলাম D\tকলাম F\tকলাম G\tকলাম I\tকলাম J\n'; // Data rows for (let row = 0; row < maxRows; row++) { const rowData = [25 + row]; allColumns.forEach(col => { const colData = seatPlanData.find(c => c.column === col); const value = colData && row < colData.rolls.length ? colData.rolls[row] : ''; rowData.push(value); }); textContent += rowData.join('\t') + '\n'; } navigator.clipboard.writeText(textContent).then(() => { alert('সিট প্ল্যান কপি করা হয়েছে! Google Sheets এ পেস্ট করুন।'); }).catch(() => { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = textContent; document.body.appendChild(textArea); textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); alert('সিট প্ল্যান কপি করা হয়েছে!'); }); } function showAlert(message, type) { const alertDiv = document.getElementById(type + 'Alert'); alertDiv.textContent = message; alertDiv.style.display = 'block'; setTimeout(() => { alertDiv.style.display = 'none'; }, 3000); } </script> </body> </html>
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bigcode-project/starcoder#166
No description provided.