QnABuilderAI / templates /select_questions.html
aradhyapavan's picture
Upload 12 files
6c54eb3 verified
{% extends "base.html" %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-9">
<div class="card">
<div class="card-header text-center">
<h2 class="mb-1 text-gradient"><i class="bi bi-sliders2"></i> Question Settings</h2>
<div class="text-muted">Choose question types and how many you want per difficulty</div>
</div>
<div class="card-body">
<form method="POST" id="questionForm">
<!-- Question Types (Aesthetic cards) -->
<div class="mb-4">
<label class="form-label fw-semibold d-block mb-2"><i class="bi bi-grid-3x3-gap"></i> Question Types</label>
<div class="type-grid">
<!-- MCQs -->
<label class="type-card">
<input class="d-none" type="checkbox" name="q_types" value="mcqs" id="mcqCheck">
<div class="tc">
<div class="tc-icon bg-indigo"><i class="bi bi-list-ul"></i></div>
<div class="tc-text">
<div class="tc-title">MCQs</div>
<div class="tc-sub">Multiple choice questions</div>
</div>
</div>
</label>
<!-- Short Answer -->
<label class="type-card">
<input class="d-none" type="checkbox" name="q_types" value="short_qa" id="shortCheck">
<div class="tc">
<div class="tc-icon bg-teal"><i class="bi bi-chat-dots"></i></div>
<div class="tc-text">
<div class="tc-title">Short Answer</div>
<div class="tc-sub">Brief factual responses</div>
</div>
</div>
</label>
<!-- Descriptive -->
<label class="type-card">
<input class="d-none" type="checkbox" name="q_types" value="descriptive" id="descCheck">
<div class="tc">
<div class="tc-icon bg-amber"><i class="bi bi-pencil-square"></i></div>
<div class="tc-text">
<div class="tc-title">Descriptive</div>
<div class="tc-sub">Detailed long-form answers</div>
</div>
</div>
</label>
</div>
<div class="form-text mt-2">Tip: You can select multiple types at once.</div>
</div>
<!-- MCQs counts -->
<div id="mcqsBlock" class="qpanel" style="display:none;">
<div class="qpanel-h"><i class="bi bi-list-ul"></i> MCQs</div>
<div class="row g-3">
<div class="col-md-4"><label class="form-label">Easy</label><input type="number" name="mcqs_easy" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Medium</label><input type="number" name="mcqs_medium" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Hard</label><input type="number" name="mcqs_hard" class="form-control" min="0" max="10" value="1"></div>
</div>
</div>
<!-- Short Answer counts -->
<div id="shortBlock" class="qpanel" style="display:none;">
<div class="qpanel-h"><i class="bi bi-chat-dots"></i> Short Answer</div>
<div class="row g-3">
<div class="col-md-4"><label class="form-label">Easy</label><input type="number" name="short_qa_easy" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Medium</label><input type="number" name="short_qa_medium" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Hard</label><input type="number" name="short_qa_hard" class="form-control" min="0" max="10" value="1"></div>
</div>
</div>
<!-- Descriptive counts -->
<div id="descBlock" class="qpanel" style="display:none;">
<div class="qpanel-h"><i class="bi bi-pencil-square"></i> Descriptive</div>
<div class="row g-3">
<div class="col-md-4"><label class="form-label">Easy</label><input type="number" name="descriptive_easy" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Medium</label><input type="number" name="descriptive_medium" class="form-control" min="0" max="10" value="1"></div>
<div class="col-md-4"><label class="form-label">Hard</label><input type="number" name="descriptive_hard" class="form-control" min="0" max="10" value="1"></div>
</div>
</div>
<div class="d-flex gap-2 mt-3 justify-content-between">
<a href="{{ url_for('manage_topics') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Back
</a>
<button type="submit" class="btn btn-primary btn-lg" id="generateBtn">
<i class="bi bi-magic"></i>
Generate Questions
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Loading Overlay -->
<div id="loadingOverlay" class="loading-overlay" style="display:none;">
<div class="cube-loader">
<div class="cube cube1"></div>
<div class="cube cube2"></div>
<div class="cube cube3"></div>
<div class="cube cube4"></div>
</div>
<div class="loading-msg">Generating your questions… This may take a moment.</div>
</div>
{% endblock %}
{% block scripts %}
<script>
document.addEventListener('DOMContentLoaded', () => {
const mcqCheck = document.getElementById('mcqCheck');
const shortCheck = document.getElementById('shortCheck');
const descCheck = document.getElementById('descCheck');
const mcqsBlock = document.getElementById('mcqsBlock');
const shortBlock = document.getElementById('shortBlock');
const descBlock = document.getElementById('descBlock');
const form = document.getElementById('questionForm');
const overlay = document.getElementById('loadingOverlay');
const generateBtn = document.getElementById('generateBtn');
function toggleBlocks() {
mcqsBlock.style.display = mcqCheck.checked ? 'block' : 'none';
shortBlock.style.display = shortCheck.checked ? 'block' : 'none';
descBlock.style.display = descCheck.checked ? 'block' : 'none';
}
[mcqCheck, shortCheck, descCheck].forEach(el => el.addEventListener('change', () => {
const lbl = el.closest('label.type-card');
if (lbl) lbl.classList.toggle('active', el.checked);
toggleBlocks();
}));
document.querySelectorAll('label.type-card input').forEach(el => {
const lbl = el.closest('label.type-card');
if (lbl) lbl.classList.toggle('active', el.checked);
});
toggleBlocks();
generateBtn.addEventListener('click', (e) => {
e.preventDefault();
overlay.style.display = 'flex';
setTimeout(() => form.requestSubmit(), 60);
});
});
</script>
<style>
/* Type card grid */
.type-grid{ display:grid; grid-template-columns: repeat(auto-fit,minmax(220px,1fr)); gap:12px; }
.type-card{ cursor:pointer; }
.type-card .tc{ display:flex; align-items:center; gap:12px; padding:14px 16px; border:1.5px solid var(--border-color); border-radius:12px; background:#fff; box-shadow: var(--shadow-sm); transition:.2s ease; }
.type-card:hover .tc{ border-color: var(--primary-color); box-shadow: var(--shadow-md); }
.type-card.active .tc{ border-color: var(--primary-color); background: linear-gradient(135deg,#eef2ff,#ffffff); box-shadow: var(--shadow-md); }
.tc-icon{ width:40px; height:40px; border-radius:10px; display:flex; align-items:center; justify-content:center; color:#fff; }
.bg-indigo{ background:#6366f1; }
.bg-teal{ background:#10b981; }
.bg-amber{ background:#f59e0b; }
.tc-title{ font-weight:600; }
.tc-sub{ font-size:.85rem; color: var(--text-secondary); }
/* Panels */
.qpanel{ border:1px solid var(--border-color); border-radius:12px; padding:16px; background:#fff; }
.qpanel-h{ font-weight:600; margin-bottom:8px; color:#111827; }
/* Loading overlay */
.loading-overlay{ position:fixed; inset:0; background:rgba(255,255,255,.9); display:flex; align-items:center; justify-content:center; flex-direction:column; gap:1.25rem; z-index:1050; }
.loading-msg{ color:#1e293b; font-weight:600; }
.cube-loader{ width:60px; height:60px; position:relative; transform:rotateX(45deg) rotateZ(45deg); transform-style:preserve-3d; }
.cube{ position:absolute; width:100%; height:100%; box-sizing:border-box; border:4px solid #6366f1; animation: cube-rotate 1.4s infinite ease-in-out; }
.cube1{ transform:translateZ(30px); }
.cube2{ transform:rotateY(90deg) translateZ(30px); animation-delay:.1s; }
.cube3{ transform:rotateX(90deg) translateZ(30px); animation-delay:.2s; }
.cube4{ transform:rotateY(180deg) translateZ(30px); animation-delay:.3s; }
@keyframes cube-rotate{ 0%,100%{ border-color:#6366f1; } 50%{ border-color:#4f46e5; } }
</style>
{% endblock %}