130 lines
4.9 KiB
JavaScript
130 lines
4.9 KiB
JavaScript
function $id(id) { return document.getElementById(id); }
|
||
|
||
/* ---------- Оценка + комментарии ---------- */
|
||
|
||
function openGradeEditor(btn) {
|
||
var all = [];
|
||
try { all = JSON.parse(btn.getAttribute('data-comments') || '[]'); } catch (e) { all = []; }
|
||
var idx = parseInt(btn.getAttribute('data-ci') || '0', 10);
|
||
var list = Array.isArray(all[idx]) ? all[idx] : [];
|
||
|
||
$id('grade-student').value = btn.getAttribute('data-student') || '';
|
||
$id('grade-lab').value = btn.getAttribute('data-lab') || '';
|
||
$id('grade-who').value = btn.getAttribute('data-student-name') || '';
|
||
var title = $id('grade-title');
|
||
if (title) title.textContent = (btn.getAttribute('data-lab-name') || '') + ' — ' + (btn.getAttribute('data-student-name') || '');
|
||
$id('grade-score').value = btn.getAttribute('data-score') || '';
|
||
|
||
var box = $id('cs-rows');
|
||
box.innerHTML = '';
|
||
list.forEach(function (c) { csRow(c.text, c.tone); });
|
||
if (!list.length) csRow('', 'neutral');
|
||
|
||
var d = $id('modal-grade');
|
||
if (d && d.showModal) d.showModal();
|
||
}
|
||
|
||
function csRow(text, tone) {
|
||
var box = $id('cs-rows');
|
||
var row = document.createElement('div');
|
||
row.className = 'cs-row';
|
||
|
||
var inp = document.createElement('input');
|
||
inp.className = 'input cs-text';
|
||
inp.placeholder = 'Комментарий';
|
||
inp.value = text || '';
|
||
|
||
var sel = document.createElement('select');
|
||
sel.className = 'input cs-tone';
|
||
[['positive', '+ позитивный'], ['negative', '— негативный'], ['neutral', '○ нейтральный']].forEach(function (o) {
|
||
var op = document.createElement('option');
|
||
op.value = o[0];
|
||
op.textContent = o[1];
|
||
sel.appendChild(op);
|
||
});
|
||
sel.value = tone || 'neutral';
|
||
|
||
var rm = document.createElement('button');
|
||
rm.type = 'button';
|
||
rm.className = 'btn btn-secondary btn-sm';
|
||
rm.textContent = 'удалить';
|
||
rm.onclick = function () { row.remove(); };
|
||
|
||
row.appendChild(inp);
|
||
row.appendChild(sel);
|
||
row.appendChild(rm);
|
||
box.appendChild(row);
|
||
}
|
||
|
||
function csSerialize() {
|
||
var out = [];
|
||
document.querySelectorAll('#cs-rows .cs-row').forEach(function (r) {
|
||
var t = r.querySelector('.cs-text').value.trim();
|
||
if (t) out.push({ text: t, tone: r.querySelector('.cs-tone').value });
|
||
});
|
||
$id('grade-comments').value = JSON.stringify(out);
|
||
}
|
||
|
||
/* ---------- Индивидуальное задание (защита) ---------- */
|
||
|
||
/** Открывает диалог задания; кнопка может не нести data-* (тогда это «назначить новое»). */
|
||
function openDefense(btn) {
|
||
var form = $id('defense-form');
|
||
if (!form) return;
|
||
form.reset();
|
||
var student = btn.getAttribute('data-student') || '';
|
||
var lab = btn.getAttribute('data-lab') || '';
|
||
if (student) $id('defense-student-select').value = student;
|
||
if (lab) $id('defense-lab-select').value = lab;
|
||
$id('defense-md').value = btn.getAttribute('data-md') || '';
|
||
|
||
var session = btn.getAttribute('data-session') || '';
|
||
var status = btn.getAttribute('data-status') || '';
|
||
var actions = $id('defense-actions');
|
||
if (session) {
|
||
$id('defense-issue-form').action = '/admin/defenses/' + session + '/issue-code';
|
||
$id('defense-reset-form').action = '/admin/defenses/' + session + '/reset';
|
||
if ($id('defense-action-lab')) $id('defense-action-lab').value = lab;
|
||
if ($id('defense-reset-lab')) $id('defense-reset-lab').value = lab;
|
||
$id('defense-reset-form').hidden = status !== 'ready';
|
||
if (actions) actions.hidden = false;
|
||
} else if (actions) {
|
||
actions.hidden = true;
|
||
}
|
||
|
||
var d = $id('modal-defense');
|
||
if (d && d.showModal) d.showModal();
|
||
}
|
||
|
||
function showDefenseFromModal() {
|
||
var el = $id('defense-text-body');
|
||
if (el) el.textContent = $id('defense-md').value || '(пусто)';
|
||
var title = $id('defense-text-title');
|
||
if (title) {
|
||
var s = $id('defense-student-select');
|
||
var l = $id('defense-lab-select');
|
||
var who = s && s.selectedOptions[0] ? s.selectedOptions[0].textContent : '';
|
||
var lab = l && l.selectedOptions[0] ? l.selectedOptions[0].textContent : '';
|
||
title.textContent = who + ' — ' + lab;
|
||
}
|
||
var d = $id('modal-defense-text');
|
||
if (d && d.showModal) d.showModal();
|
||
}
|
||
|
||
/* ---------- Матрица: фокус на лабораторной ---------- */
|
||
|
||
function focusLab() {
|
||
var s = $id('lab-focus');
|
||
if (!s) return;
|
||
var labId = s.value;
|
||
document.querySelectorAll('th.lab-col[data-lab], td.cell-lab[data-lab], .filter-row th[data-lab]').forEach(function (el) {
|
||
el.style.display = (!labId || el.getAttribute('data-lab') === labId) ? '' : 'none';
|
||
});
|
||
}
|
||
|
||
document.addEventListener('submit', function (ev) {
|
||
if (ev.target && ev.target.id === 'grade-form') csSerialize();
|
||
}, true);
|
||
|
||
window.addEventListener('DOMContentLoaded', function () { focusLab(); });
|