-
Notifications
You must be signed in to change notification settings - Fork 530
Open
Description
<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>
একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম ২০২৬
সিট প্ল্যান ও কক্ষ তথ্য ব্যবস্থাপনা
<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 তৈরি করতে:
-
https://forms.google.com এ যান
-
নতুন ফর্ম তৈরি করুন
-
এই ফিল্ডগুলো যোগ করুন:
- কক্ষের তথ্য (Short answer)
- বিদ্যালয়ের তথ্য (Paragraph)
- সিট প্ল্যান স্ট্যাটাস (Short answer)
- জমা দেওয়ার সময় (Short answer)
-
Form responses কে আপনার Google Sheets এর সাথে connect করুন
-
Form এর ID দিয়ে কোডে আপডেট করুন`);
}</script>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); }
Metadata
Metadata
Assignees
Labels
No labels