task_generator / static /script.js
reginafeles's picture
Upload 40 files
d2213a5 verified
let taskTypesConfig = null;
let selectedTaskTypes = new Set();
document.addEventListener('DOMContentLoaded', () => {
initTaskTypes();
});
async function initTaskTypes() {
const response = await fetch('/task-types');
taskTypesConfig = await response.json();
renderDropdown();
}
function renderDropdown() {
const dropdown = document.getElementById('taskTypesDropdown');
dropdown.innerHTML = '';
dropdown.appendChild(
createTypeGroup('Классическая вероятность', taskTypesConfig.classic)
);
dropdown.appendChild(
createTypeGroup('Теоремы вероятности', taskTypesConfig.theorems)
);
updateSelectedCount();
}
function createTypeGroup(title, types) {
const group = document.createElement('div');
group.className = 'type-group';
const header = document.createElement('div');
header.className = 'type-group-title';
header.textContent = title;
const tags = document.createElement('div');
tags.className = 'type-tags';
types.forEach(type => {
const tag = document.createElement('div');
tag.className = 'type-tag active';
tag.textContent = type.name;
tag.dataset.id = type.id;
selectedTaskTypes.add(type.id);
tag.addEventListener('click', () => {
tag.classList.toggle('active');
if (selectedTaskTypes.has(type.id)) {
selectedTaskTypes.delete(type.id);
} else {
selectedTaskTypes.add(type.id);
}
updateSelectedCount();
});
tags.appendChild(tag);
});
group.appendChild(header);
group.appendChild(tags);
return group;
}
function selectAllTypes() {
document.querySelectorAll('.type-tag').forEach(tag => {
tag.classList.add('active');
selectedTaskTypes.add(Number(tag.dataset.id));
});
updateSelectedCount();
}
function clearAllTypes() {
document.querySelectorAll('.type-tag').forEach(tag => {
tag.classList.remove('active');
});
selectedTaskTypes.clear();
updateSelectedCount();
}
function updateSelectedCount() {
document.getElementById('selectedCount').textContent =
`${selectedTaskTypes.size} выбрано`;
}
function getSelectedTaskTypes() {
return Array.from(selectedTaskTypes);
}
async function generateTasks() {
const count = Number(document.getElementById('count').value);
const complexity = document.getElementById('complexity').value;
const taskTypes = getSelectedTaskTypes();
const loading = document.getElementById('loading');
const error = document.getElementById('error');
const tasksContainer = document.getElementById('tasks-container');
tasksContainer.innerHTML = '';
error.style.display = 'none';
if (taskTypes.length === 0) {
error.textContent = 'Выберите хотя бы один тип задач';
error.style.display = 'block';
return;
}
loading.style.display = 'block';
const response = await fetch('/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ count, complexity, task_types: taskTypes })
});
const data = await response.json();
loading.style.display = 'none';
displayTasks(data.tasks);
}
function displayTasks(tasks) {
const container = document.getElementById('tasks-container');
tasks.forEach((task, index) => {
const div = document.createElement('div');
div.className = 'task';
div.innerHTML = `
<div class="task-header">
<div class="task-number">Задача ${index + 1}</div>
<div class="task-type">${task.type}</div>
</div>
<div class="question">${task.question}</div>
<div class="answer-section">
<div class="answer-value">${task.answer}</div>
<div>${task.answer_fraction}</div>
</div>
<div class="solution-section">
<div class="solution-title">Решение</div>
${task.steps.map(s => `<div class="step">${s}</div>`).join('')}
</div>
`;
container.appendChild(div);
});
}