Найди своё направление!
Заполни форму и выбери слова, которые тебе близки. Мы подберём для тебя дополнительные направления в нашем колледже.
Анкета участника
Рекомендуемые направления:
`;
resultsContainer.appendChild(d);
});
}
resultElement.style.display = ‘block’;
if (Array.isArray(data.selectedTags)) {
tagElements.forEach(el => {
if (data.selectedTags.includes(el.textContent)) el.classList.add(‘selected’);
});
}
counterElement.textContent = `Выбрано: ${data.selectedTags?.length || 0} из ${MAX_SELECTIONS}`;
cloudNote.textContent = ‘Выбор ранее был зафиксирован.’;
}
function toggleTag(tagElement, tagData) {
const isSelected = tagElement.classList.contains(‘selected’);
if (isSelected) {
tagElement.classList.remove(‘selected’);
selectedTags = selectedTags.filter(t => t.text !== tagData.text);
} else {
if (selectedTags.length >= MAX_SELECTIONS) {
alert(`Можно выбрать не более ${MAX_SELECTIONS} слов.`);
return;
}
tagElement.classList.add(‘selected’);
selectedTags.push(tagData);
}
counterElement.textContent = `Выбрано: ${selectedTags.length} из ${MAX_SELECTIONS}`;
submitBtn.disabled = !canSubmit();
cloudNote.textContent = selectedTags.length === MAX_SELECTIONS
? ‘Можно менять выбор до отправки.’
: »;
}
function lockTagSelectionUI() {
document.querySelector(‘.cloud-section’).classList.add(‘cloud-locked’);
tagElements.forEach(el => el.setAttribute(‘aria-disabled’, ‘true’));
}
function canSubmit() {
const fioOk = !!document.getElementById(‘fullName’).value.trim();
const groupOk = !!document.getElementById(‘group’).value.trim();
const opOk = !!document.getElementById(‘op’).value.trim();
const telOk = !!document.getElementById(‘telephone’).value.trim();
const emailOk = !!document.getElementById(’email’).value.trim();
const tagsOk = selectedTags.length === MAX_SELECTIONS;
return fioOk && groupOk && opOk && telOk && emailOk && tagsOk;
}
// SUBMIT
applicationForm.addEventListener(‘submit’, async function (e) {
e.preventDefault();
if (getCookie(‘ks54_additional_submitted’) === ‘1’) {
alert(‘Заявка уже была отправлена ранее.’);
return;
}
if (selectedTags.length !== MAX_SELECTIONS) {
alert(`Выберите ровно ${MAX_SELECTIONS} слов.`);
return;
}
// 1) Подготовка результата
calculateResults();
const topResults = getTopResults(MAX_RESULTS);
const selectedTagNames = selectedTags.map(t => t.text);
const directions = topResults.map((r, i) => `${i + 1}) ${r.title} [${r.key}: ${r.score}] rn`);
const group = document.getElementById(‘group’).value.trim();
const op = document.getElementById(‘op’).value.trim();
const activityText =
`Группа: ${group}; ОП: ${op}; rn` +
`Выбранные теги: ${selectedTagNames.join(‘, ‘)}; rn` +
`Рекомендованные направления: ${directions.join(‘; rn’)}`;
// Вписываем в скрытое поле (должно иметь name, не должно быть disabled)
messageField.value = activityText;
// 2) Рендерим результаты локально
showResults(topResults);
// 3) ГОТОВИМ ДАННЫЕ ДО БЛОКИРОВКИ ФОРМЫ (ключевой фикс)
const actionUrl = applicationForm.getAttribute(‘action’) || »;
const resolvedUrl = new URL(actionUrl, location.href).toString();
const formData = new FormData(applicationForm);
// Для отладки: убедитесь, что все пары ключ-значение присутствуют
try {
for (const [k, v] of formData.entries()) {
console.log(‘FormData ->’, k, v);
}
} catch (_) {}
// 4) Теперь можно заблокировать форму и UI
lockForm();
// 5) Сохраняем в куку для повторного визита
try {
const payload = {
selectedTags: selectedTagNames,
topResults: topResults.map(r => ({ key: r.key, score: r.score, title: r.title, description: r.description })),
group, op, ts: Date.now()
};
setCookie(‘ks54_additional_result’, JSON.stringify(payload), 180);
} catch(e){}
// 6) Отправляем
try {
const resp = await fetch(resolvedUrl, {
method: ‘POST’,
body: formData,
redirect: ‘follow’,
// Раскомментируйте, если сервер использует куки/сессию
// credentials: ‘include’
});
if (resp.ok) {
setCookie(‘ks54_additional_submitted’, ‘1’, 180);
cloudNote.textContent = ‘Заявка отправлена. Спасибо!’;
} else {
console.warn(‘Webhook response not OK:’, resp.status, resp.statusText);
cloudNote.textContent = ‘Заявка зафиксирована локально. Сервер ответил с ошибкой. Попробуйте повторить отправку.’;
addRetryButton(() => resend(formData, resolvedUrl));
}
} catch (err) {
// Фолбэк no-cors (ответ opaque) — поведение как у вас: считаем успехом
try {
await fetch(resolvedUrl, { method: ‘POST’, body: formData, mode: ‘no-cors’ });
setCookie(‘ks54_additional_submitted’, ‘1’, 180);
cloudNote.textContent = ‘Заявка отправлена (no-cors). Спасибо!’;
} catch (err2) {
console.error(‘Webhook send failed:’, err, err2);
cloudNote.textContent = ‘Не удалось отправить заявку из-за сетевой ошибки. Попробуйте повторить отправку.’;
addRetryButton(() => resend(formData, resolvedUrl));
}
}
async function resend(fd, url) {
cloudNote.textContent = ‘Повторная отправка…’;
try {
const r = await fetch(url, {
method: ‘POST’,
body: fd,
redirect: ‘follow’,
// credentials: ‘include’
});
if (r.ok) {
setCookie(‘ks54_additional_submitted’, ‘1’, 180);
cloudNote.textContent = ‘Заявка успешно повторно отправлена. Спасибо!’;
} else {
cloudNote.textContent = ‘Сервер снова вернул ошибку. Попробуйте позже.’;
}
} catch (e) {
try {
await fetch(url, { method: ‘POST’, body: fd, mode: ‘no-cors’ });
setCookie(‘ks54_additional_submitted’, ‘1’, 180);
cloudNote.textContent = ‘Заявка повторно отправлена (no-cors).’;
} catch (e2) {
cloudNote.textContent = ‘Не удалось повторно отправить. Проверьте интернет и попробуйте позже.’;
}
}
}
function addRetryButton(onClick) {
if (document.getElementById(‘retryBtn’)) return;
const btn = document.createElement(‘button’);
btn.id = ‘retryBtn’;
btn.type = ‘button’;
btn.className = ‘submit-btn’;
btn.textContent = ‘Повторить отправку’;
btn.addEventListener(‘click’, onClick);
resultElement.insertAdjacentElement(‘afterend’, btn);
}
});
function calculateResults() {
totalScores = { champions: 0, theatre: 0, council: 0, sport: 0, volunteer: 0, esport: 0, tourism: 0, patriotic: 0, media: 0 };
selectedTags.forEach(tag => {
for (const [key, value] of Object.entries(tag.values)) {
totalScores[key] += value;
}
});
}
function getTopResults(count) {
const scoresArray = Object.entries(totalScores)
.filter(([_, score]) => score > 0)
.sort((a, b) => b[1] — a[1])
.slice(0, count);
return scoresArray.map(([key, score]) => ({ key, score, …results[key] }));
}
function showResults(topResults) {
resultsContainer.innerHTML = »;
if (topResults.length === 0) {
resultsContainer.innerHTML = ‘
Не удалось определить подходящие варианты.
‘;
resultElement.style.display = ‘block’;
return;
}
topResults.forEach((result, index) => {
const resultCard = document.createElement(‘div’);
resultCard.className = ‘result-item’;
resultCard.innerHTML = `
`;
resultsContainer.appendChild(resultCard);
});
resultElement.style.display = ‘block’;
resultElement.scrollIntoView({ behavior: ‘smooth’ });
}
[‘fullName’,’group’,’op’,’telephone’,’email’].forEach(id => {
document.getElementById(id).addEventListener(‘input’, () => {
submitBtn.disabled = !canSubmit();
});
});
});
